2009-11-04 94 views
9

我正在創建一個小小的C#應用​​程序,它目前由一個核心程序集和一個winforms程序集組成。我意識到我可能不需要Ninject這樣的小事情,但我想嘗試一下。C#,Ninject:你把內核和你的模塊放在哪裏?

反正,與Ninject一起工作我已經理解你會寫一組模塊,這些模塊會返回映射類,等等。之後,您將創建一個IKernel的實例並將您的模塊加載到該實例中。

但是,我在哪裏保留這些模塊?我在哪裏保持內核?東西去哪裏?

回答

3

您可以爲內核創建靜態包裝類。這樣你可以做一些像ServiceLocator.Resolve()

註冊服務有兩種方式:內聯和模塊註冊。它們都應該在bootstrapping中加載。模塊更適合組織。

也許從StructureMap開始會比較容易,因爲它有靜態類,它具有自動映射功能。

那些截屏應該讓你開始:

3

+1馬立克氏答案 - 絕對通過這些資源的樣子。

幾點......

你是絕對正確的去嘗試這一點,即使在一個小應用程序。認真思考諸如你所提出的那些簡單的表面問題也很重要。對於DI來說,你真的必須真正做一些工作才能真正感謝它 - 我一直在「哦,我只有一個小應用程序」(拒絕)陣營很長一段時間,直到我真正使用它。

雖然有一所學校雖然一般應該遠離服務定位器,只是注射[沒有任何對容器的依賴]。

如果你不使用服務定位器,沒有人需要知道容器(內核)在哪裏,哪個是最好的。

模塊主要用於劃分批次的事物以在特定的整體容器(內核)中進行註冊。

當然,Ninject有一個規範的'Global Container'Singleton實現嗎?編輯:剛剛發現一個: - http://www.codethinked.com/creating-a-binding-factory-for-ninject

參見Ninject: How do I inject into a class library?

+0

我只是想找一個規範的方式來做到這一點,並認爲「太棒了!」當我看到你鏈接一個。壞消息,該代碼是TERRIFICALLY UNTHREADSAFE。如果我將內核包裝在一個單例中,我可以以一種安全的方式(提示,靜態構造函數)自己做到這一點,但要警告未來所有的人:鏈接文章是一個完全不是線程安全的實現。 – 2013-01-25 18:01:22

+0

@JimmyHoffa我同意它不是線程安全的(建議從http://csharpindepth.com/articles/general/singleton.aspx應用您選擇的方法)。然而,遠遠好於我的迴應的主要觀點,即有一個組合根,它有一個明確的位置,可以進行初始化,以便將此線程安全性(以及其他問題)的需要排除在圖像之外完全。 – 2013-01-25 18:28:15

+0

我不熟悉你的組合根,但沒有訪問內核,你如何請求你想要構造函數注入的對象?在你的用戶界面中,你需要訪問你的'UserManager',它在構造時需要'IUserRepository';你如何在不訪問內核的情況下獲取UserManager'(通過類似服務定位器的東西)?你不能只是'新的UserManager(???);'並且期望正確的東西被交給它的構造函數嗎? – 2013-01-25 19:46:40

0

我的觀點:如馬立克說,你應該爲內核,它包含的iKernel例如一些(可能是靜態的)包裝。它應該包含Resolve < T>方法,並且可能包含Load(INinjectModule模塊)方法 - 全部是靜態的。

在每個程序集中,您可以簡單地定義自己的INinjectModule,該程序映射此程序集內的類。

內核包裝處於'最低',最常見的組件(通常是Log和Utils所在的組件)。這是因爲內核必須可以從所有部件訪問 - 所以它必須在組件中,這是所有其他組件引用的。如果你沒有一個,你總是有足夠的空間來創建一個。這可能看起來有點棘手,可以預期內核將處於「最高」程序集(可執行程序)。不對。

要註冊組件中的所有模塊,只需在每個模塊中調用Kernel.Load(new XXModule)。