Asp.net web api 如何在StructureMap ServiceActivator中使用容器而不是ObjectFactory?

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

在使用StructureMap在WebAPI中实现DI时,我们使用了


但是现在有了新的结构图,我的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
         });
     }
}