2012-02-08 152 views
4

我有3個組件Presenter,Business和DataAccess。 Presenter引用Business和Business引用DataAccess。錯誤構造函數重載模擬

我有一個CustomerBusiness類,在商業程序集中,有2個單參數構造函數。第一個構造函數僅用於測試以模擬數據訪問對象。 DataAccess程序集中的ICustomerDataAccess。

class CustomerBusiness() 
    { 
     private ICustomerDataAccess _data= null; 

     public CustomerBusiness(ICustomerDataAccess data) 
     { 
     _data = data; 
     } 

     public CustomerBusiness(string language): this(new CustomerDataAccess("language")) 
     {} 

     public void SomeOtherMethods() 
     { 
     ... 
     } 
    } 

在CustomerPresenter類我寫了下面這使錯誤數據訪問組件未在演示referened代碼。但我不想在Presenter中添加對DataAccess的引用。

VAR custBusiness =新CustomerBusiness(「英語」)

誰能推薦什麼是實現這一目標的最佳方式,避免了在演示引用數據訪問?

僅當存在兩個單參數構造函數時纔會出現此錯誤。 錯誤去的方式時,我有以下構造函數:

 public CustomerBusiness(ICustomerDataAccess data, string language) 
     { 
     _data = data; 
     } 

     public CustomerBusiness(string language): this(new CustomerDataAccess("language")) 
    {} 

回答

2

我建議你將你的接口定義成合同組件,讓您的實現使用IoC容器(如Unity注入在運行時,但也有很多選擇從)。

這將打破'實現'程序集之間的編譯時間依賴關係,並且不需要創建單獨的構造函數來傳遞模擬。

E.G.

Presentation refs >> IBusiness(Consumes) 
Business  refs >> IBusiness(Implements), IDataAccess(Consumes) 
IDataAccess refs >> IDataAccess(Implements) 
2

誰能推薦什麼是實現這一目標的最佳方式,避免 Presenter中引用數據訪問?

我建議要麼使用IoC容器或起泡的依賴一路攀升到你的應用程序的根......

你是對的 - 你不是主持人應該知道你的數據訪問類。但是,您遇到問題的水域是讓您的「客戶業務」知道並負責實例化數據訪問類。你用來進行測試的第一個構造函數非常好 - 這是你應該擁有的只有

然後,您應該讓您的Presenter類在其構造函數中創建一個「CustomerBusiness」對象。然後,它可以在不知道如何實例化或如何實例化數據訪問對象,甚至是數據訪問對象的存在的情況下使用CustomerBusiness。