2017-02-19 8 views
0

ストラクチャマップを使用してコンフィグレーションを行うときに、ブートストラップの問題を発生させずにサービスを構築するためにStructureMapを使用するようにAutoMapper 5に指示する方法ブートストラップAutoMapper&StructureMapからConstructServicesUsing

カスタムリゾルバは、AutoMapperで使用するサービスロケータが必要ですが、AutoMapperがStructureMapレジストリ内で初期化されている間に​​は存在しません。静的ObjectFactory.ContainerはのStructureMapに廃止されましたので、私は怠け者の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 => 
     { 
      x.AddRegistry<MyRegistry>(); // AutoMapper is configured here 
     }); 
    } 
} 

私は、スタックオーバーフローまたは「怠惰な工場内で参照値」を取得するので、私はAutoMapperプロファイルからObjectFactory.Containerを参照することはできません。

AutoMapperの設定後に.ConstructUsing(some_IContainer)をタックする方法はありますか?

答えて

0

lamdba-based registrationsを使用することで、まだ構築されていなくてもコンテナを活用できます。

class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     For<MapperConfiguration>() 
      .Use("Use StructureMap context to resolve AutoMapper services", ctx => 
      { 
       return new MapperConfiguration(config => 
       { 
        config.ConstructServicesUsing(type => ctx.GetInstance(type)); 
       }); 
      }); 
    } 
} 

あなたは鶏と卵の問題を避けるため、この方法:

MapperConfigurationのご登録は、のようになります。

WARNING

私はこのコードをテストしていない、と私はのStructureMapに慣れていませんよ。

関連する問題