7

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

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

StructureMap.ObjectFactory.GetInstance<Interface>()

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

我错过了什么吗?还是 Simple Injector 不适用于我的应用?

请提前告知和感谢。

4

1 回答 1

15

允许应用程序直接访问容器被认为是不好的做法。它是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 是一件坏事的原因之一:您切换了容器,现在您必须更改应用程序代码。

也许现在最简单的方法是将容器保存在静态字段中(如上例所示),但请花时间理解为什么这种模式不好,并从这种模式重构为依赖注入(以及特别是构造函数注入)。

于 2012-08-03T14:13:36.867 回答