プロパティの名前が異なる場合のマッピングルールの指定方法


144

私はAutomapperフレームワークの初心者です。次のようにドメインクラスとDTOクラスがあります。

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

注:クラスのプロパティ「Name」の名前は、Employeeクラスのプロパティ「FullName」の名前と同じではありませんEmployeeDto

そして、これがEmployeeオブジェクトをマッピングするコードですEmployeeDto

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

私の質問は:(Employeeソースクラス)をEmployeeDto(宛先クラス)にマップする場合、マッピングルールを指定するにはどうすればよいですか?つまり、上記のコード行(***)をさらに活用するにはどうすればよいですか?

回答:


292

気にしないで、私自身が解決策を見つけました:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

1
接頭辞/接尾辞のようなクラスにグローバルに指定する方法はありますか?たとえば、「Localizations」プロパティをそれぞれ持つライブラリのクラスがたくさんあります。そして、それらを対応するプロパティが「LocalizedName」と呼ばれるクラスにマップしたいと思います。私の唯一のオプションは、各マッピング構成にForMemberを追加することですか?
NickAb

2
MapperクラスにCreateMapメソッドはありません:(
Navid_pdp11

3
@ Navid_pdp11はい、あります。インスタンスではなく静的クラスMapperが必要です
Jordy van Eijk

@JordyvanEijk静的な「CreateMap」メソッドを持つどのバージョンを使用していますか?5.1.1.0ではそのようなことはありません
Matt Thomas

6
@MattThomas automapperのgithubを確認した後、バージョン5.0のCreateMapは廃止されており、MapperConfigurationまたはMapper.Initializeを使用する必要があると言われています。
ジョーディファンエイク

7

Automapper 8.1以降を使用して、上記のコメントを最新のアプローチにまとめるだけです...

var mapConfig = new MapperConfiguration(
   cfg => cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

次に、mapConfigを使用してマッパーを構築します。

var mapper = mapConfig.CreateMapper();

2

マッピングのためにクラス属性を指定することもできます

https://docs.automapper.org/en/stable/Conventions.html#attribute-supportから

属性のサポート

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); *現在は常にオンです

プロパティ/フィールドのSourceToDestinationMapperAttributeのインスタンスを探し、ユーザー定義のisMatch関数を呼び出して、一致するメンバーを見つけます。

MapToAttributeは、指定された名前に基づいてプロパティと一致するそれらの1つです。

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

他の場所から逐語的にコンテンツを引用する場合は、ブロック引用形式を使用して、コンテンツがコピーされたことを読者に明確に伝えてください。
TylerH

新しいスタイルを確認してください:) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian Bargaoanu

Stackoverflowの新機能です。確かに@TylerHのルールに従います
Pranay DevOps
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.