我需要創建一個接口和數據訪問類實現它。此外,我將不得不添加一個構造函數 到業務邏輯類,將 接受該接口 類型的參數。因此,這意味着我將結束 在 應用Main()方法創建數據訪問類和 東西告訴我這不是最好的 方法(是不是真的OK了 切入點應該瞭解一些 數據訪問的東西什麼?如果鏈 要長得多還是應該有 幾個連鎖店?)
相反!這個是最好的方法,至少從可測試性的角度來看。
使您的業務邏輯層可測試的唯一方法是通過完成您正在考慮的內容來將其與數據訪問層隔離。
您的頂層應用程序是buck停止的地方 - 它是唯一需要知道具體數據訪問類是什麼的組件。
如果鏈條長得多或有多條鏈,這沒什麼大不了的(儘管如果它失控時可能需要考慮摺疊某些應用程序層)。考慮這種潛在的代碼Model-View-Presenter
應用程序的View
,其中Presenter
有一個CustomerService
的依賴,這對一個AccountingService
上Repository
的依賴和依賴(這也是依賴於Repository
):
public CustomerView() {
IRespository repository = new ConcreteRepository();
IAccountingService accountingService = new ConcreteAccountingService(repository);
ICustomerService customerService = new ConcreteCustomerService(accountingService, repository)
this._Presenter = new CustomerPresenter(customerService);
}
最後,如果你不想使用依賴注入容器(儘管其中有些是令人驚訝的輕量級),那麼就不需要使用依賴注入容器 - 手工依賴注入可以正常工作,直到你開始在整個地方重複自己(或者你想要配置運行時的依賴關係)。
+1:很好的答案!我特別喜歡「降價停止線」。對DI容器也有好評! – TrueWill 2009-09-21 17:38:15
@Jeff - 謝謝,我會試試看。雖然我悲觀的存在告訴我應該有一些隱藏的陷阱:) – Dev 2009-09-21 18:18:52
@Dev:懷疑主義是靠近敬虔! ;) – 2009-09-21 18:20:41