如何替换 StructureMap 3 中的 ObjectFactory 用法

How to replace ObjectFactory usage in StructureMap 3

目前我们使用 StructureMap v2.6 进行依赖注入,我们的设置是这样的:

在 Application_Start 我们有:

DependencyResolver.SetResolver(new StructureMapDependencyResolver(IoC.Initialize()));

而Initialize方法是这样实现的:

public static IContainer Initialize() {
        ObjectFactory.Initialize(x => {
            x.Scan(scan => { scan.TheCallingAssembly(); scan.WithDefaultConventions(); });

          x.For<IFoo>().Use(() => new Foo());

        });
        return ObjectFactory.Container;
    }
}

在我们的整个代码中,我们有几个地方使用 ObjectFactory.GetInstance<IFoo>() 而不是使用构造函数注入。对于 StructureMap 的 v3,这已被标记为过时,所以我的问题是我们如何使用最新版本实现相同的目的。

您需要挂在 IContainer 上并改用它。

如果构造函数注入是不可能的,那么恐怕你的选择有限。

普遍共识,, is to roll your own ObjectFactory. Here is a simple implementation of an ObjectFactory 您可以使用之前 link 中引用的内容。

如果您正在利用 StructureMap 的 HttpContext bound nested container 并且 class 引用 StructureMap 的对象工厂位于 UI 层中,那么您可以使用的另一个选项是获取嵌套的容器直接来自 HttpContext.Items。这有点脏,但可以做到。

这是您可以使用容器代替已弃用的 ObjectFactory 的方法

 internal class StructureMapBootStrapper
{
    internal static IContainer Container
    {
        get
        {
            var container = new Container(x =>
            {
                x.For<IXXXCheck>().Use<XXXCheck>();
            });

            DependencyResolver.SetResolver(new XXXCheckDependencyResolver(container));
            return container;
        }
    }
}

并在基础 ApiController 的无参数构造函数中包含它 class。

 public BaseApiController()
        : this(StructureMapBootStrapper.Container.GetInstance<IXXXCheck>())
    {
    }