今日、AutoMapper v1.1 を使用していた完全に機能するアプリケーションをアップグレードして、AutoMapper v2.1 を使用するようにしたところ、以前のバージョンでは遭遇しなかったいくつかの問題が発生しています。
以下は私のコードマッピングの例です。までにドメイン物体
public class TypeOne
{
public TypeOne()
{
}
public TypeOne(TypeTwo two)
{
//throw ex if two is null
}
public TypeOne(TypeTwo two, TypeThree three)
{
//throw ex if two or three are null
}
public TypeTwo Two {get; private set;}
public TypeThree Three {get; private set;}
}
public class TypeOneDto
{
public TypeOneDto()
{
}
public TypeTwoDto Two {get; set;}
public TypeThreeDto Three {get; set;}
}
...
Mapper.CreateMap<TypeThreeDto, TypeThree>();
Mapper.CreateMap<TypeTwoDto, TypeTwo>();
Mapper.CreateMap<TypeOneDto, TypeOne>();
var typeOne = Mapper.Map<TypeOne>(typeOneDto);
しかし、v2.1 で最初に遭遇した問題は、引数の 1 つが null で、1 つの引数のコンストラクターを使用する必要があるのに、AutoMapper が 2 つの引数を持つコンストラクターを使用しようとしていたことです。
私はその後、
Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne());
しかし、解決できない「あいまいな呼び出し」エラーが繰り返し発生しました。
私はその後
Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne());
パラメータなしのコンストラクターを使用して TypeOne オブジェクトを正常に作成しましたが、プライベート セッター プロパティの設定に失敗しました。
AutoMapper の Web サイトでヘルプを探し、ソース コードをダウンロードしてよく調べてみましたが、ドキュメントが少なく、ConstructUsing の単体テストもあまりありませんでした。
v2.1 で変更する必要があるが、私が見逃している明らかな点はありますか? v1.1 から大きく変わったことに驚いています。
ベストアンサー1
追加するだけです明示的なキャストに
Func<ResolutionContext, TypeOne>
コードは次のとおりです:
Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(
(Func<ResolutionContext, TypeOne>) (r => new TypeOne()));
AutoMapper の現在のバージョンは以下のように動作します。
宛先型コンストラクタをパラメータ数でソートする
destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length);
パラメータがソース プロパティと一致する最初のコンストラクターを取得します (null 値のチェックなし)。この場合、2 つのパラメータを持つコンストラクターです。