1. ホーム
  2. c#

[解決済み] 複数のソースからAutoMapperで変換する

2023-06-19 03:23:25

質問

2つのモデルクラスがあるとします。

public class People {
   public string FirstName {get;set;}
   public string LastName {get;set;}
}

Phoneというクラスも持っています。

public class Phone {
   public string Number {get;set;}
}

そして、このようにPeoplePhoneDtoに変換したいのです。

public class PeoplePhoneDto {
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public string PhoneNumber {get;set;}
}

私のコントローラの中にあるとします。

var people = repository.GetPeople(1);
var phone = repository.GetPhone(4);

// normally, without automapper I would made
return new PeoplePhoneDto(people, phone) ;

このシナリオの例を見つけることができないようです。これは可能ですか?

注:例はこの質問のためだけのものであり、本物ではありません。

どのように解決するのですか?

多くのソースを一つの宛先に直接マッピングすることはできません。 Andrew Whitaker の回答通りです。そのため、すべてのマッピングを定義する必要があります。

Mapper.CreateMap<People, PeoplePhoneDto>();
Mapper.CreateMap<Phone, PeoplePhoneDto>()
        .ForMember(d => d.PhoneNumber, a => a.MapFrom(s => s.Number));

そして、これらのマッピングのいずれかを用いて目的地のオブジェクトを作成し、作成したオブジェクトに他のマッピングを適用します。そして、このステップは非常にシンプルな拡張メソッドで簡略化することができます。

public static TDestination Map<TSource, TDestination>(
    this TDestination destination, TSource source)
{
    return Mapper.Map(source, destination);
}

使い方はとても簡単です。

var dto = Mapper.Map<PeoplePhoneDto>(people)
                .Map(phone);