AutomapperとDependency Injectionの併用 質問する

AutomapperとDependency Injectionの併用 質問する

現在、次のマッピングがあります。

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 (型コンバーター、値リゾルバーなど) へのフックを提供します。

おすすめ記事