我有以下結構的3層溶液:如何在多層解決方案上正確使用StructureMap(或任何其他IoC容器)?
UI - > BLL < - DAL
的UI是ASP.NET MVC應用程序。每個控制器在其構造函數上都需要BLL組件。每個BLL組件在其構造函數上都需要DAL組件。
在過去,我使用StructureMap作爲IoC容器。在其早期版本中,StructureMap使用了靜態的ObjectFactory
類。因爲它是一個靜態類,所以我可以使用MVC上的StructureMap來替換默認的ControllerFactory
,然後替換其他BLL和DAL配置項目。
在較新的StructureMap版本上,ObjectFactory已被標記爲廢棄。我明白現在我必須提供自己的Container實例。
但是,我沒有連接發生沒有我的項目連接。此外,如果我將配置添加到BLL和DAL到MVC項目中,我將不得不引用我想避免的UI級別的所有內容。
我認爲我必須做的是使用StructureMap保留兩個不同的項目。
一個在MVC項目中,負責創建控制器。但是,我需要找出將BLL實例委派給第二個容器的方法,該容器可能會保留在原來的位置,並知道如何創建BLL和DAL(因此可以創建BLL)。
第二個(以創建BLL組件)是這樣的:
public static class BLLContainer
{
public static Container BuildServiceContainer()
{
return new Container(x =>
{
// This uses the Scan method to locate BLL and DAL
// interfaces and implementations.
x.AddRegistry(new DALRegistry());
});
}
}
我的問題是:
難道真的有可能從我的MVC應用程序的委託對象的創建無需引用其他(不需要)項目的BLL級別的StructureMap容器?
如果我按照上面的代碼返回容器的一個新實例,這意味着我正在爲Web服務器的每個請求運行掃描器(StructureMap使用PerRequest作爲默認值)。我怎樣才能避免這種情況?我看不出如何防止除了回到單身人士之外。
相關:http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-in-entry-application – Steven 2015-02-09 06:35:23