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();