現在我有一些服務是在不依賴IoC容器的組件中定義的(Ninject就是我的情況)。在主項目中,我有一個在容器中註冊的用於數據訪問的IRepository。一般IoC實踐 - 服務互相依賴是錯誤的嗎?
this.Bind<IRepository>().To<EntityFrameworkRepository<MyDatabaseEntities>>();
我也有IAuthenticationService和IErrorLogger服務註冊,其具體實現我想爲他們的邏輯使用存儲庫。但是,我不知道如何最好地完成這一點。目前,我的兩個具體實現構造採取IRepository參數,我通過它時,我註冊他們:
this.Bind<IAuthenticationService>().To<MyAuthenticationService>().
WithConstructorArgument("myRepository", ctx => ctx.Kernel.Get<IRepository());
在這裏,我只是告訴容器搶IRepository實例,並把它傳遞給構造函數。
我覺得我的服務程序集依賴於ninject甚至是公共服務定位器(CSL),但我不確定我目前的方式。我正在尋找意見和替代解決方案。
如果我的其他服務沒有使用IRepository,我將不得不爲每種底層IRepository類型(例如假冒和真實數據的AuthenticationService)創建這些服務的新具體實現。這將是很多邏輯重複。
偉大的信息!你是對的,我根本不需要指定WithConstructorArgument。他們被自動注入。另一個問題是如果我註冊2個IRepository實現,每個實例都有不同的名稱。然後我想指定要注入的那個。我知道Ninject有一個NamedAttribute,但爲了避免在我的服務程序集中添加Ninject依賴項,我不想使用它。所以在這種情況下手動指定將是方法?僅供參考,我的重複擔心不是關於IRepository,而是其他服務類別。 – Adam 2012-02-13 19:11:09
對於Ninject,你可以使用'WhenInjectedInto()'其中Foo是你的服務類。通常情況下,您只會註冊您的存儲庫的一個具體實現 - 虛假數據和測試的註冊不應該作爲主應用程序的一部分註冊,只能在單獨的測試容器中註冊 –
BrokenGlass
2012-02-13 19:17:33
完美,再次感謝。 – Adam 2012-02-13 19:19:21