如何在StructureMap 3中替换ObjectFactory用法

时间:2015-04-17 23:36:24

标签: dependency-injection structuremap structuremap3

目前我们使用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,这已被标记为过时,所以我的问题是我们如何使用最新版本实现相同的功能。

3 个答案:

答案 0 :(得分:3)

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

普遍的共识和suggested by StructureMaps creator in a similar question是推送自己的ObjectFactory。您可以使用上一个链接中引用的simple implementation of an ObjectFactory

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

答案 1 :(得分:1)

你需要挂在IContainer上并使用它。

答案 2 :(得分:0)

这就是你如何使用Container而不是被描述的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;
        }
    }
}

在baseApiController类的无参数构造函数中使用它。

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