Asp.net-Mvc

哪裡是 Simple Injector 等效於 StructureMap 的 ObjectFactory

  • October 31, 2020

我正在從 StructureMap 遷移到 ASP.NET MVC3 應用程序中的 Simple Injector。

我正在為控制器 DI 使用 MVC3 擴展,但在嘗試替換 StructureMap 的靜態方面時遇到了問題。我們有電話

StructureMap.ObjectFactory.GetInstance<Interface>()

貫穿應用程序的不同層。看起來 Simple Injector 沒有辦法做到這一點。

我錯過了什麼嗎?還是 Simple Injector 不適用於我的應用?

請提前告知和感謝。

允許應用程序直接訪問容器被認為是不好的做法。它是Service Locator 反模式的一種形式。

因為這被認為是一件壞事,所以 Simple Injector 不包含任何類似 StructureMap 的東西ObjectFactory.GetInstance。事實上,StructureMap 的作者正在考慮在 StructureMap 的未來版本中刪除API ObjectFactory

但是,沒有什麼能阻止您將SimpleInjector.Container實例儲存在靜態欄位中並讓應用程序使用它:

// Service Locator implementation in low application layer.
public static class ObjectFactory
{
   private static SimpleInjector.Container container;
   
   public static void SetContainer(Container container)
   {
       ObjectFactory.container = container;
   }
   
   public static T GetInstance<T>() where T : class
   {
       return container.GetInstance<T>();
   }
}

在組合根中:

public static void Initialize()
{
  var container = new Container();      

  InitializeContainer(container);
  
  DependencyResolver.SetResolver(
       new SimpleInjectorDependencyResolver(container));   

  // Set the service locator here
  ObjectFactory.SetContainer(container);
}

因此,Simple Injector 並沒有阻止您這樣做的限制,但坦率地說,您已經見證了 Service Locator 是一件壞事的原因之一:您切換了容器,現在您必須更改應用程式碼。

也許現在最簡單的方法是將容器保存在靜態欄位中(如上例所示),但請花時間理解為什麼這種模式不好,並從這種模式重構為依賴注入(以及特別是建構子注入)。

引用自:https://stackoverflow.com/questions/11621201