28

今日、AutoMapper v1.1 を使用して完全に機能するアプリケーションをアップグレードして、AutoMapper v2.1 を使用するようにしましたが、以前のバージョンでは遭遇しなかったいくつかの問題に遭遇しています。

これは、 DtoからDomainオブジェクトへのコード マッピングの例です。

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からここまで変わったことに驚いています。

4

2 に答える 2

53

明示的なキャストを 追加するだけです

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つのパラメーターを持つコンストラクターです。

于 2012-06-27T12:04:40.493 に答える