2010-05-27 50 views
3

我想實現依賴注入來使我的應用測試友好。 我有一個相當基本的疑問。依賴注入和軟件層的解耦

數據層使用SqlConnection對象連接到SQL服務器數據庫。 SqlConnection對象是數據訪問層的依賴項。按照 依賴注入的規律,我們不得new()依賴對象,而寧願通過構造函數參數接受它們。不想破壞DI神,我在我的DAL中忠實地創建了一個構造函數,它接受了SqlConnection。

業務層調用DAL。因此業務層必須傳入SqlConnection。 表示層調用業務層。因此它也必須通過SqlConnection 到業務層。

這對類隔離和可測試性很好。但是,我們不是僅僅將 用戶界面和業務層連接到數據層的特定實現,而發生 以使用關係數據庫?

爲什麼Presentation和Business層需要知道底層數據存儲 是SQL?如果應用程序需要支持除SQL服務器 以外的多個數據源(例如XML文件,逗號分隔文件等),那麼該怎麼辦?另外,如果我添加另一個對象 (我的數據層依賴於它) )。現在,我要 修改上層來傳遞這個新對象。

我該如何避免這種旋轉木馬,並獲得DI沒有痛苦的所有好處?

+0

+1優秀的問題。 – Matt 2013-02-25 21:35:12

回答

3

坦率地說,你應該做的是創建一個訪問你的數據的通用接口。一個Repository,然後創建這個接口的Sql實現,並且不注入你的SqlConnection。

這種方式在測試中,您只需使用測試實現(模擬)替換通用接口的SqlImplementation,然後關閉。

我認爲你鑽到DI太遠了。在Sql實現的情況下,您應該注入連接字符串,而不是SqlConnection本身。

+0

因此,您所說的是將連接到數據源所需的任何設置封裝到實現IRepository接口並向下傳播的SqlRepository類中。並在層次結構頂部的控制器類中嵌入知識庫選擇。因此,DI是在解耦的情況下實現的,因爲中間層不需要知道正在使用哪個特定的存儲庫。那肯定會奏效。 – cs31415 2010-05-28 16:07:12

+1

是的,您可以創建'TestRepository'或'FlatFileRepository'或'DavidBowieInSpaceRepository',然後在您的配置中選擇您想要的實現。 IRepository是如何工作的細節與您的控制器/中間層無關。 這樣,您也可以使用DI通過構造函數中的DI來滿足實現特定的配置。 – Aren 2010-05-28 16:11:57

+0

感謝您的明確解釋。如果我有名譽,我會投票給你。 – cs31415 2010-05-28 16:32:57