4

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

4

3 回答 3

3

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

StructureMaps 创建者在类似问题中建议的普遍共识是推出您自己的 ObjectFactory。这是一个简单的 ObjectFactory 实现,您可以使用上一个链接中引用的它。

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

于 2015-04-18T01:21:12.033 回答
1

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

于 2015-04-18T01:20:58.380 回答
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>())
    {
    }
于 2016-03-04T11:40:32.793 回答