2011-08-01 69 views
4

希望這個問題不是太愚蠢,我試圖抓住更高級的編程原則,並因此試圖習慣使用Ninject進行依賴注入。依賴注入:如何在使用多項目解決方案時注入

因此,我的模型被分成幾個不同的.dll項目。一個項目定義了模型規範(接口),另外一些則實現了這些接口。所有模型項目都需要使用某種數據庫系統,所以他們都需要訪問另一個實現我所有數據庫邏輯的.dll。儘管如此,如果僅僅爲每個模型創建一個實例,它們都可以訪問我的數據庫對象的同一個實例是非常重要的。

雖然我不太清楚如何使用依賴注入來實現這一點。我的第一個想法是創建一個單獨的DI項目並將所有接口綁定到它們各自的實現,因此DI項目需要引用所有其他項目(模型接口&實現,數據庫系統等)。然後再次,模型需要訪問DI項目,例如,他們需要從DI系統(Ninject)請求數據庫系統。當然,這會創建一個循環引用(綁定DI項目來模擬和建模DI項目),所以這是不可能的。長話短說,我需要一種編程模式,允許我將模型接口綁定到他們的實現,但是這也允許模型實現請求Ninject的其他依賴項,例如,

IModel1 -> Model1 
IModel2 -> Model2 (different project) 
IDatabase -> Database (different project) 
Model1 -> request IDatabase -> get Database instance 
Model2 -> request IDatabase -> get the same Database instance 

很高興能得到一些建議,現在我堅持和的想法;) 謝謝!

+0

這是一個網站的這是什麼? –

回答

1

客戶端應用程序將使用Ninject注入實際的數據庫和模型實現。

客戶端應用程序因此需要引用數據庫,idatabase,model和imodel項目。

idatabase和數據庫項目需要引用模型項目,因爲這些方法將返回模型對象或模型對象的集合。看看repository pattern

您的模型不需要引用任何項目。

+0

謝謝你的回答!所以我想我的模型接受依賴的唯一方法是通過構造器注入,對吧?因爲到目前爲止,我一直在使用Ninject.kernel.Get (Ninject是內核的單例提供者)在需要時爲我的數據庫創建新會話,所以有時在同一個方法中有幾次。在這種特殊情況下,直接從數據庫對象請求會話並不是一個問題,但是不可能存在需要其他DI方法而不僅僅是構造器注入的情況? – James

+1

如果您使用POCO(http://en.wikipedia.org/wiki/Plain_Old_CLR_Object),則不需要向模型對象中注入任何東西。 –

7

的模型將需要訪問DI項目,因爲,例如, 他們會需要從DI系統 (Ninject)要求數據庫系統

當您使用依賴注入,該模型不需要訪問DI框架,因爲它是注入依賴關係的DI框架。模型對象不應該詢問DI容器。當你的對象詢問容器的依賴性時,它不叫做依賴注入,而是服務定位器。服務定位器is considered an anti-pattern

我首先想到的是要建立一個單獨的DI-項目

當你有一個應用程序(即Web應用程序),通常做的事情到底是完全配置DI容器應用程序儘可能接近應用程序的入口點。這被稱爲Composition Root

所有示範項目需要使用某種數據庫系統,所以他們 都需要它實現了我所有的數據庫 邏輯

嘗試使POCO(普通舊CLR對象又一個.dll文件訪問)模型/實體對象,或者至少確保這些對象不需要引用任何其他項目,這使得您的架構(和測試)更容易。