2014-01-25 92 views
1

我想在它具有以下架構的項目中使用簡單的注射器:簡單的注射器

  • DAL層(擁有倉庫),
  • BLL層(擁有服務與存儲庫交談),
  • MVC層(與BLL層中的服務對話)。

當涉及向容器註冊類和接口時,我面臨一個問題,簡單注入器需要我用其接口註冊存儲庫(因爲我的服務層中的類接受存儲庫中的存儲庫他們的構造函數)

所以,實際上,簡單注入器迫使我添加一個引用到我的MVC層,我真的很喜歡避免。

我的問題是,是否有可能/正確的做一個只能容納簡單注射器的外部項目,這個項目將引用所有其他項目,這樣我就能夠註冊我想要的東西並仍然保留我的項目抽象?

還是有其他簡單方法可以解決這個問題?

+1

[?IOC/DI - 爲什麼我要引用的所有圖層/組件的輸入應用程序]中可能重複(http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-in-entry-application) – Steven

+0

是的,謝謝。儘管我仍然沒有完全明白它,所以我的MVC應用程序(它具有Composition Root - global.asax)應該引用所有其他項目?並通過圖表給出了答案,其他所有項目都沒有提及任何其他項目。我怎麼能不把我的BLL層引用到我的DAL層?我需要知道我在構造函數中得到的是什麼類型。或者我應該把所有接口放在一個Common項目中?再次感謝。 – jony89

+0

你讀過第二個答案(哪個是我的)?組合根必須隱含地或明確地引用*所有其他項目;這是沒有辦法的,這是很好的,你不應該試圖阻止這一點。由於您決定將組合根和演示文稿圖層放在同一個程序集中,因此該程序集也會引用所有其他項目。但是,這並不意味着您的演示文稿*圖層*引用了所有其他圖層。 – Steven

回答

2

DI容器(例如您的簡單進樣器)只能從組合根中引用。所有其他模塊應該沒有對容器的引用。

您可以在此處詳細瞭解了組成根:

http://blog.ploeh.dk/2011/07/28/CompositionRoot/

更重要的是應該使用註冊解析完全從成分根內釋放模式被應用DI容器。 更多關於這個模式在這裏:

http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/

+0

你的文章所說的正是我所做的,我有一個MVC應用程序,因此我把註冊命令放在global.asax中(實際上,我使用SimpleInjector快速安裝,因此它使用了外部類,但它確實使用了global.asax),但是,這並不能解決我的問題,即使我在我的global.asax中註冊註冊我仍然需要從我的MVC層到我的DAL層的引用。 – jony89

相關問題