今日、AutoMapper 2.0.0から2.2.0にアップデートしましたが、アップデートによってコードが壊れていることに気づきました。automapper githubサイトに問題として投稿する前に、ここでそれについて質問したかった。
私の宛先タイプの1つは、次のようにコレクションプロパティを初期化します。
public class PageOf<TModel>
{
public PageOf()
{
Items = Enumerable.Empty<TModel>();
}
public IEnumerable<TModel> Items { get; set; }
}
automapper 2.0.0では、これは問題ありませんでした。2.2.0にアップデートしたとき、この宛先タイプにマッピングすると、「コレクションは固定サイズでした」というメッセージとともにNotSupportedExceptionが発生しました。(その例外はAutoMapperMappingException内にラップされていました。)
上記のコンストラクターコードを次のように変更することで、問題を修正できました。
public PageOf()
{
Items = new List<TModel>();
}
AutoMapper 2.0.0はItemsプロパティにある値をすべて破棄し、set
プロパティアクセサーを使用しているように見えますが、AutoMapper 2.2.0はget
プロパティアクセサーを使用して、既存のIEnumerableを変更しようとしています。Enumerable.Empty<TModel>()
例外を説明する長さゼロの配列を置き換えているように見えます。
これはバグですか?AutoMapperで2.0.0と2.2.0の間で何が変更され、宛先プロパティセッターを無視し、代わりに既存のコレクションを変更しようとしますか?
アップデート:
要求に応じて、CreateMap呼び出しは次のとおりです。
public class PagedQueryResultToPageOfItemsProfiler : Profile
{
protected override void Configure()
{
CreateMap<PagedQueryResult<EstablishmentView>, PageOfEstablishmentApiModel>();
}
}
クラスはPageOfEstablishmentApiModel
から継承しPageOf<EstablishmentApiModel>
ます。
Mapper.Mapコードは次のとおりです。
var query = Mapper.Map<EstablishmentViewsByKeyword>(input);
var results = _queryProcessor.Execute(query);
var model = Mapper.Map<PageOfEstablishmentApiModel>(results); // exception here
AutoMapperで2.0.0から2.2.0に移行する際に特別なマッピング構成(たとえば、.ConvertUsing(x => x))が必要な場合は、古いバージョンを使用しなければならない場合があります。AMがコレクションのプロパティを自動的に変換する方法が好きでした。それがないと、AMはValueInjecterのように見えます。