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