1

我有以下結構的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()); 
     }); 
    } 
} 

我的問題是:

  1. 難道真的有可能從我的MVC應用程序的委託對象的創建無需引用其他(不需要)項目的BLL級別的StructureMap容器​​?

  2. 如果我按照上面的代碼返回容器的一個新實例,這意味着我正在爲Web服務器的每個請求運行掃描器(StructureMap使用PerRequest作爲默認值)。我怎樣才能避免這種情況?我看不出如何防止除了回到單身人士之外。

+0

相關: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

回答

3

我從來沒有使用過StructureMap,所以我的回答不是關於StructureMap或者你如何使用它。

當您使用依賴注入時,所有關於您的composition root都會聚集在一起。這是完整的應用程序得到的地方,所以這個地方也需要你的應用程序的完整知識。

如果您確實不想從UI中引用您的DAL,則可以將組合根置於不同的程序集中,並從UI組件中引用該程序集。

但有什麼區別?通過引用UI中的BL和DAL程序集,只要您僅從組合根中引用DAL中的類,而不是直接在控制器中使用它們,I.M.O.就不會做任何錯誤。除了錯誤地創造可能性以外,沒有其他問題。

關於你的第二個問題。您的應用程序必須有1個且只有1個DI容器。將它拆分成多個容器會給你帶來麻煩。已經提到的Mark Seeman的博客明確指出,每個應用程序都需要一個組合根。

一個體面的DI容器會給你各種選項來控制創建對象的生命週期,因此只要你給容器提供oppurtunity,所有的singleton就不是必需的。

我選擇的DI容器是Simple Injector。你可以開始閱讀關於這個容器here。簡單的注射器也有一個快速啓動包MVC和非常熱心的社區,總是樂意幫助你。

+0

感謝您的意見。 SimpleInjector非常簡單,在閱讀完答案後,我已經替換了StructureMap。我所做的是最初在UI之外創建容器,但唯一調用它的地方是global.asax中的MVC應用程序,根據有關組合根的博客文章。正如你所說,我這樣做是爲了防止在界面中使用DAL。 – 2015-02-09 00:18:51

相關問題