如何替换 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>())
{
}
目前我们使用 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 上并改用它。
如果构造函数注入是不可能的,那么恐怕你的选择有限。
普遍共识,
如果您正在利用 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>())
{
}