4

AutofacでAutomapperを設定するための包括的なガイドを知っている人はいますか。私は両方に不慣れですが、静的Mapperクラスをいじってみましたが、IMappingEngineをモックして注入し、すべてのマッピングをセットアップする構成を作成できるようにしたいと考えています。私がこれまで見てきたすべてのガイドは、何が起こっているのかを実際に説明しておらず、私はそれを完全に理解することができません。また、私はAutofac 3.0を使用していますが、これはContainerBuilderメソッドにいくつかの違いがあるようですが役に立ちません(私が使用している理由は、Autofac.mvc4がそれに依存しているためです)。

アップデート:

OK、最も簡単な解決策は十分に機能しているようですが、インターネット上のどこにも見たことがありませんでした。それはおそらく、私が知らない正当な理由があるのでしょうか。最も簡単な方法は、静的Mapper.EngineをIMappingEngineとして登録し、静的Mapper.CreateMapを使用して最初に構成することです。

var builder = new ContainerBuilder();
builder.Register<IMappingEngine>(c => Mapper.Engine);

これで、AutofacはIMappingEngineをコンストラクターに注入できます。これは、マッパーがAutofacではなくIMappingEngineシングルトンを処理し、Autofacがそのラッパーとして機能していることを意味します。AutofacでIMappingEngineインスタンスを処理したいのですが、方法がわかりません。

4

1 に答える 1

10

単体テストでマッパーをモックしたり、ネストされたライフタイムスコープの構成を変更してマッパーを作成したりしたくない場合は、単純なソリューションで問題ありません(後者は私には少し奇妙に見えますが、誰が知っていますか)。

それが必要な場合はMapperクラスからいくつかのコードを取得して、次のようにコンポーネントを登録できます。

builder.Register(ctx => new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()))
       .AsImplementedInterfaces()
       .SingleInstance();

builder.RegisterType<MappingEngine>()
       .As<IMappingEngine>();

本当にIMappingEngineシングルトンを作成する必要があるかどうかはわかりません。依存関係ごとに作成するのは非常に軽量である必要があります。

これで、次のように使用できます。

// in a bootstrapper:
var mapperConfig = ctx.Resolve<IConfiguration>();
mapperConfig.CreateMap<A, B>();

// later on:
public class X{
    IMappingEngine _mapper;

    public X(IMappingEngine mapper){
        _mapper = mapper;
    }

    public B DoSmth(){
        return _mapper.Map<B>(new A());
    }
}

次のように自動プロファイル登録を設定することもできます。

builder.Register(ctx => new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()))
       .AsImplementedInterfaces()
       .SingleInstance()
       .OnActivating(x => {
           foreach (var profile in x.Context.Resolve<IEnumerable<Profile>>()){
               x.Instance.AddProfile(profile);
           }
       });

次にProfile、Autofac構成またはモジュールの任意の場所に実装を登録して、構成に接続します。

于 2013-02-03T19:37:36.677 に答える