2015-04-01 200 views
1

比方說,我有一個CustomerManager類,有很多與DAL.CustomerManager交互的方法。但也有很多不與DAL.CustomerManager類交互的方法。創建一個經理類的實例

我應該像下面的代碼實例化_dalCustomerManager類嗎?

public class CustomerManager { 

    private DAL.CustomerManager _dalCustomerManager = new DAL.CustomerManager(); 


    public void DeleteCustomer(int customerId) { 
     // .. do some logic here ... 
     _dalCustomerManager.DeleteCustomer(customerId); 
    } 
} 

或者這是一個更好的解決辦法,因爲我不總是_dalCustomerManger的情況下,當我訪問dalCustomerManager財產它創建它的一個新的實例時,它的空?

public class CustomerManager { 

    private DAL.CustomerManager _dalCustomerManager; 
    private DAL.CustomerManager dalCustomerManager { 
     get { 
      return _dalCustomerManager ?? (_dalCustomerManager = new DAL.CustomerManager());     
     } 
    } 


    public void DeleteCustomer(int customerId) { 
     // .. do some logic here ... 
     dalCustomerManager.DeleteCustomer(customerId); 
    } 
} 
+0

「因爲我並不總是_dalCustomerManger的一個實例」不是嗎?所以你明確地將私有字段設置爲空?否則,你總是有一個實例給你的經理。 – HimBromBeere 2015-04-01 11:15:00

回答

0

那麼,如果你的DAL.CustomerManager類真的是很長的創建,這可能會有所幫助。 在這種情況下我更懶,它可以這樣使用:

public class CustomerManager 
{ 
    private Lazy<DAL.CustomerManager> _lazyDalManager= new Lazy<CustomerManager>(()=>new DAL.CustomerManager()); 

    protected DAL.CustomerManager DalCustomerManager 
    { 
     get { return _lazyDalManager.Value; } 
    } 
} 
+0

謝謝,這正是我需要的! – user3223133 2015-04-01 11:32:15

+0

@ user3223133不客氣。不要忘記標記答案 – 2015-04-01 11:34:49

+0

我想但我需要15名聲譽:( – user3223133 2015-04-01 23:38:51

1

這是品味的問題。除非DAL.CustomerManager()有廣泛的構造函數(例如分配很多類,做一些耗時的工作),這並不重要。

此鏈接可能對您有用(一般在微優化):http://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/

另外,我想指出的是,在你的代碼的DAL.CustomerManager延遲加載不是線程安全的:

private DAL.CustomerManager dalCustomerManager { 
    get { 
    // if two threads are calling this you'll allocate two instances. 
    return _dalCustomerManager ?? (_dalCustomerManager = new DAL.CustomerManager());     
    } 
}