AutoMapper が間違ったコンストラクタを使用している 質問する

AutoMapper が間違ったコンストラクタを使用している 質問する

今日、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 の現在のバージョンは以下のように動作します。

  1. 宛先型コンストラクタをパラメータ数でソートする

    destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length);
    
  2. パラメータがソース プロパティと一致する最初のコンストラクターを取得します (null 値のチェックなし)。この場合、2 つのパラメータを持つコンストラクターです。

おすすめ記事