2010-10-08 234 views
0

我正在訪問數據庫以批量填充字段。數據訪問的惰性初始化

PopulateAobjs(); 
PopulateBobjs(); 
PopulateCobjs(); 
... 

一旦填充值,我將實體存儲在Dictionary<Id, Entity>中。

我想使這個過程很懶,以這種方式,如果我不需要C對象,那麼我不需要調用該方法。等等。

這怎麼辦?

LazyInit <>?

+1

你怎麼知道你是否需要「C」對象?什麼使用「C」對象? – codeConcussion 2010-10-08 21:16:08

+0

我在方法中使用A和B對象,但我沒有使用C對象。 – DarthVader 2010-10-08 21:25:05

回答

2

而不是做這樣的初始化例程,你寧願使用延遲加載屬性這樣的事情。

private Lazy<IEnumerable<CObject>> cObjects = new Lazy<IEnumerable<CObject>>(LoadCObjects); 

public IEnumerable<CObject> CObjects 
{ 
    get { return this.cObjects.Value; } 
} 

CObjects然後將在任何人第一次訪問屬性時加載。

編輯:當你在.NET 4.0中卻沒有,Lazy<T>僅僅是像一個奇特的方式:

private IEnumerable<CObject> cObjects; 

public IEnumerable<CObject> CObjects 
{ 
    get 
    { 
     if (this.cObjects == null) 
      lock (this.someLockObject) 
       if (this.cObjects == null) 
        this.cObjects = this.LoadCObjects(); 

     return this.cObjects; 
    } 
} 
+0

只有我不在.net 4.所以我應該看看LazyInit <>? – DarthVader 2010-10-08 21:25:47

+0

更新了答案。你也可以使用'LazyInit <>',它應該和'Lazy <>'類似。 – herzmeister 2010-10-08 21:37:00

0

爲了做到這一點,我通常有加載集合中的屬性的代碼得到方法。根據類,它將直接加載數據或請求全局緩存加載數據。

Property FooCustomers 
    Get 
     If _Customers IS NULL THEN Then _Customers = CustomerCache.FindByKey(companyKeys) 
     Return _Customers