Asp.net web api 如何在StructureMap ServiceActivator中使用容器而不是ObjectFactory?
在使用StructureMap在WebAPI中实现DI时,我们使用了Asp.net web api 如何在StructureMap ServiceActivator中使用容器而不是ObjectFactory?,asp.net-web-api,structuremap,Asp.net Web Api,Structuremap,在使用StructureMap在WebAPI中实现DI时,我们使用了 但是现在有了新的结构图,我的ReSharper建议: 类“StructureMap.ObjectFactory”已过时:ObjectFactory将在StructureMap的未来4.0版本中删除。在将来的工作中支持容器类的使用 Container上的intellisense只提供了非常有限的信息 我们应该如何用容器类重写我们的ServiceActivator。如果您不使用某种类型的服务定位器,您将实现自己的“Obj
但是现在有了新的结构图,我的ReSharper建议: 类“StructureMap.ObjectFactory”已过时:ObjectFactory将在StructureMap的未来4.0版本中删除。在将来的工作中支持容器类的使用
Container
上的intellisense只提供了非常有限的信息
我们应该如何用容器类重写我们的ServiceActivator。如果您不使用某种类型的服务定位器,您将实现自己的“ObjectFactory
”,如下所示:
公共静态类ObjectFactory
{
私有静态只读惰性容器生成器=
新的Lazy(defaultContainer、LazyThreadSafetyMode.ExecutionAndPublication);
公共静态集装箱
{
获取{return\u containerBuilder.Value;}
}
私有静态容器defaultContainer()
{
返回新容器(x=>
{
//默认配置
});
}
}
更新:我以前的回答是错误的。感谢@JoeMighty的提醒。这肯定会创建一个空容器的新实例吗?根据我的经验,情况似乎是这样。@JoeMightly引用作者的话:“无论如何,ObjectFactory只是容器上的一个静态外观”。然而,今天晚些时候我会提出一个要点来证明这一点;然而,我似乎最终得到了一个空容器。如果能提供一个要点来证明这一点,我们将不胜感激@你说得对!我使用服务定位器和/或内置MVC DependencyResolver来解决SM3问题,所以我从未遇到过这个问题。然而,在几次测试之后,据我所知,我最终得到了你提到的空容器。错误地使用模式不会导致模式本身错误。
public class ServiceActivator : IHttpControllerActivator
{
public ServiceActivator(HttpConfiguration configuration) {}
public IHttpController Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = ObjectFactory.GetInstance(controllerType) as IHttpController;
return controller;
}
}
public static class ObjectFactory
{
private static readonly Lazy<Container> _containerBuilder =
new Lazy<Container>(defaultContainer, LazyThreadSafetyMode.ExecutionAndPublication);
public static IContainer Container
{
get { return _containerBuilder.Value; }
}
private static Container defaultContainer()
{
return new Container(x =>
{
// default config
});
}
}