web-dev-qa-db-ja.com

StructureMap ServiceActivatorでObjectFactoryの代わりにContainerを使用する方法は?

StructureMapを使用してWebAPIにDIを実装する場合、ServiceActivatorを使用しました


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;
    }
}

しかし、新しいStructureMapで、ReSharperは次のように提案しました。

クラス「StructureMap.ObjectFactory」は廃止されました。ObjectFactoryは、StructureMapの将来の4.0リリースで削除されます。将来の作業のためにContainerクラスの使用を優先する

Containerのインテリセンスにより、非常に限られた情報しか得られませんでした。

ServiceActivatorContainerクラスで書き換える方法を教えてください。

34
Blaise

静的なものはなくなります 。何らかのタイプのサービスロケーターを使用しない場合は、独自の "ObjectFactory"を 参照先 として実装する必要があります。

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
         });
     }
}

更新:以前の答えが間違っていました。 @JoeMightyに感謝します。

36
mxmissile