オートマッパーでいくつかの実際の問題が発生しています。私は解決策を見つけたと思いますが、それを実装する方法がわかりません。
基本的に、私は ResolveUsing と ConstructedBy でカスタム マッピングを使用してパラメーターをコンストラクターに渡しています。ほとんどの人がこれを global.asax で一度設定して忘れていることを理解しています。
しかし、問題は、(wcf 上の) 私のメソッドが異なるパラメーターを ResolveUsing のコンストラクターに渡すことです ......
静的メソッドである Mapper.CreateMap と Mapper.Map を使用する前に、さまざまな請願がメソッド (マルチユーザー) を介して wcf サービスに入ると、互いに競合しているように見えます。
何かを読んだ後、CreateMap と Map のインスタンス バージョンを使用して、個々の請願が独自のマップを取得し、独自のパラメーターを渡すことができるように見えます。
しかし、私はそれを行う方法を見つけることができないようです。誰か説明してくれませんか?私は本当に立ち往生しています...
以前は重複キー エラーが何度も発生し、コンストラクターにログ トレースを記録したところ、一方の請願がもう一方の請願を上書きしているように見えたので、静的バージョンの Mapper が作成されました。
私が正しいことを願っていますが、他に何も見つかりません...
編集済み - 私が持っているものの例
ほとんどの場合MapFromを使用しているため、基本的にすべてのマッピングは正常に機能しています。
次に、URL で渡すリゾルバーのインスタンスを作成します。渡す前にURLを確認しましたが、正しいです。しかし、返されると、間違った URL が返されます。
URL を渡す必要がある理由は、そこに変数があるため、変数を置き換える必要があるためです... 基本的に、オフィスに応じて 2 つの URL があり、どこにでもログがあり、何を渡しているかを確認できますが、一度私はそれを渡します - それは私が渡したものではありません。
その WCF サービスとクライアントは、2 つの異なるオフィスでメソッドを 2 回呼び出したため、2 つの異なる URL を使用しています。ただし、常に同じ URL が返されます。あるセッションが他のセッションを上書きしているようです...
これが理にかなっていることを願っています。
SalesPointResolver newSalesPointResolver = new SalesPointResolver(returnReservationUrl, reservationSite.ReservationUrl, startDate, endDate, officeCode);
Mapper.CreateMap<Models.Custom.House, DTO.House>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.TaxIncluded,
opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxIncluded))
.ForMember(dest => dest.TaxPercentage,
opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxPercentage))
.ForMember(dest => dest.SalesPoints,
opt =>
opt.ResolveUsing(newSalesPointResolver))
;
どこが失敗しているかが判明 - しかし、その理由は不明
私のコメントをコードとインラインで参照してください。コンストラクターで urlTemplate が到着し、それをプライベート変数に保存し、オーバーライドされた ResolveCore でそれは別のものです:-)
そこにいくつかのlog4netログを配置したので、何が起こっているかを見ることができます.
[Log]
public class SalesPointResolver : ValueResolver<Models.Custom.House, IList<DTO.SalesPoint>>
{
private readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private string urlTemplate;
public SalesPointResolver (bool returnReservationUrl, string urlTemplate, DateTime startDate, DateTime endDate, string officeCode)
{
this.urlTemplate = urlTemplate;
log.Error("passed in " + urlTemplate); // THIS IS PERFECT
log.Error("I am now " + this.urlTemplate); // THIS IS PERFECT
}
protected override IList<DTO.SalesPoint> ResolveCore(House source)
{
this.house = source;
log.Error("in resolveCore :" + this.urlTemplate); // THIS IS RETURNING THE WRONG VALUE
一時的な解決策
一時的な解決策を実行しましたが、本当に悪いです。オートマッパーは私が試みていることを実行できると確信していますが、明らかに何か間違ったことをしています。
基本的に、LINQ を介してレコードのコレクション (THIS IS MY SOURCE) を返すので、正しい URL テンプレートを持つすべてのレコードに新しいフィールドを入力しました。そして、(コンストラクターを介して)urlテンプレートを渡す代わりに、コレクション(THE SOURCE)のすべてのレコードのプロパティとして利用できるようにしました...そしてそれは完璧に機能します。
もちろん、これは実際にはパッチであり、理想的ではありませんが、実行できます。
どこが間違っていますか?