其中Simple Injector等效于StructureMap的ObjectFactory

时间:2012-07-23 22:00:38

标签: asp.net-mvc asp.net-mvc-3 structuremap simple-injector

我正在ASP.NET MVC3应用程序中从StructureMap迁移到Simple Injector。

我正在使用控制器DI的MVC3扩展,但我遇到了尝试替换StructureMap的静态方面的问题。我们打电话给

StructureMap.ObjectFactory.GetInstance<Interface>()

应用程序的不同层。它看起来不像Simple Injector有办法做到这一点。

我错过了什么吗?或者Simple Injector不适用于我的应用程序?

请提前通知并表示感谢。

1 个答案:

答案 0 :(得分:14)

允许应用程序直接访问容器被认为是不好的做法。它是Service Locator pattern的一种形式,被认为是anti-pattern

  

简而言之,Service Locator的问题在于它隐藏了一个类'   依赖项,导致运行时错误而不是编译时错误,   以及使代码更难维护,因为它   当你引入一个突破性的变化时,你会变得不清楚。

因为这被认为是一件坏事,Simple Injector不包含任何类似StructureMap的ObjectFactory.GetInstance。事实上,在StructureMap的版本发布中ObjectFactory API的StructureMap is considering the removal的作者。

但是,没有什么能阻止您将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 void 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是一件坏事的原因之一:你切换容器,现在你必须更改应用程序代码。

也许现在最简单的方法是将容器保存在静态字段中(如上例所示),但请花些时间来理解为什么这种模式不好,并且重构从这种模式转向依赖注射(尤其是构造注射)。

祝你好运。