現在、次のマッピングがあります。
Mapper.CreateMap<Journal, JournalDto>();
現在、Journal
には という名前のメンバーが含まれておりRefTypeID
、対応する値はデータベース内の別のテーブルに存在します。この値を検索するために、単純なint -> string
リクエストを処理するサービスがあります。現在、自動マッパーの構成は、プログラムの開始時に静的クラスで行われます。マッピング コードを、DI コンテナーに挿入されるクラスに移動しても問題ありませんか、それとももっと良い方法がありますか?
ベストアンサー1
より良い方法は、カスタム リゾルバを使用することです。マッピング構成は静的であることが目的であるため、カスタム リゾルバは単一のメンバーのマッピングを提供することを目的としています。
Mapper.Initialize(cfg => {
cfg.ConstructServicesUsing(type => WhateverMefUsesToGetInstances.GetInstance(type));
cfg.CreateMap<Journal, DisplayJournal>()
.ForMember(dest => dest.RefTypeName,
opt => opt.ResolveUsing<RefTypeNameResolver>());
});
すると、リゾルバは次のようになります。
[Export(typeof(IRefTypeNameResolver))]
public class RefTypeNameResolver : ValueResolver<Journal, string>, IRefTypeNameResolver
{
private readonly IRefTypesLookup iRefTypesLookup;
[ImportingConstructor]
public RefTypeNameResolver (IRefTypesLookup rtl)
{
iRefTypesLookup = rtl;
}
protected override string ResolveCore(Journal source)
{
return iRefTypesLookup.Lookup(source.RefTypeID);
}
}
構成は一度実行する必要があるため、構成 API は実行 API (型コンバーター、値リゾルバーなど) へのフックを提供します。