22

IValueResolver新しいバージョンの AutoMapper で新しいインターフェイスを使用する方法がわかりません。おそらく、以前のバージョンの AutoMapper では不適切に使用していたのでしょう...

多くのモデル クラスがあり、そのうちのいくつかは、sqlmetal を使用して複数のデータベース サーバー上の複数のデータベースから生成されます。

これらのクラスの一部にはPublicationCode、サブスクリプション、オファー、請求書、またはそれが何であれ、どのパブリケーションに属しているかを識別する文字列プロパティ があります。

パブリケーションは 2 つのシステム (古いシステムと新しいシステム) のいずれかに存在する可能性があるため、目的のモデル クラスには、パブリケーションが古いシステムにあるか新しいシステムにあるかを示す bool プロパティがあります。

古いバージョン (<5?) の AutoMapper を使用しValueResolver<string, bool>PublicationCode、 を入力パラメーターとして受け取りbool、出版物の場所 (古いシステムまたは新しいシステム) を示す を返しました。

AutoMapper の新しいバージョン (5+?) では、これができなくなったようです。新しい IValueResolver には、私が持っているソース モデルと宛先モデルのすべての組み合わせの一意の実装がsrc.PublicationCode必要dst.IsInNewSystemです。

値リゾルバーを間違った方法で使用しようとしているだけですか? より良い方法はありますか?リゾルバーを使用したい主な理由は、サービスをコンストラクターに注入しDependencyResolver、コードでなどを使用する必要がないことです (私は Autofac を使用しています)。

現在、次の方法で使用しています。

// Class from Linq-to-SQL, non-related properties removed.
public class FindCustomerServiceSellOffers {
    public string PublicationCode { get; set; }
}

これは、PublicationCode プロパティを含む、私が持っているいくつかのデータ モデル クラスの 1 つです)。この特定のクラスは、次のビュー モデルにマップされます。

public class SalesPitchViewModel {
    public bool IsInNewSystem { get; set; }
}

これら 2 つのクラスのマッピング定義は (式は IProfileExpression です)、関連のないマッピングは削除されています。

expression.CreateMap<FindCustomerServiceSellOffers, SalesPitchViewModel>()
          .ForMember(d => d.IsInNewSystem, o => o.ResolveUsing<PublicationSystemResolver>().FromMember(s => s.PublicationCode));

そしてリゾルバ:

public class PublicationSystemResolver : ValueResolver<string, bool>
{
    private readonly PublicationService _publicationService;
    public PublicationSystemResolver(PublicationService publicationService)
    {
        _publicationService = publicationService;
    }

    protected override bool ResolveCore(string publicationCode)
    {
        return _publicationService.IsInNewSystem(publicationCode);
    }
}

そしてマッパーの使用:

var result = context.FindCustomerServiceSellOffers.Where(o => someCriteria).Select(_mapper.Map<SalesPitchViewModel>).ToList();
4

1 に答える 1

17

IMemberValueResolver<object, object, string, bool>マッピング構成でそれを実装して使用することにより、より一般的な値リゾルバーを作成できます。以前と同じように、ソース プロパティ解決関数を提供できます。

public class PublicationSystemResolver : IMemberValueResolver<object, object, string, bool>
{
    private readonly PublicationService _publicationService;

    public PublicationSystemResolver(PublicationService publicationService)
    {
        this._publicationService = publicationService;
    }

    public bool Resolve(object source, object destination, string sourceMember, bool destMember, ResolutionContext context)
    {
        return _publicationService.IsInNewSystem(sourceMember);
    }
}



cfg.CreateMap<FindCustomerServiceSellOffers, SalesPitchViewModel>()
    .ForMember(dest => dest.IsInNewSystem,
        src => src.ResolveUsing<PublicationSystemResolver, string>(s => s.PublicationCode));
于 2016-07-11T13:51:22.740 に答える