2

子プロパティを持つクラスがあります:

Person {
    string Name;
    Address Address {
        string Street;
    }
}

新しい Person オブジェクトを構築するとき、オートマッパーに次のようなものを実行させたい:

var person = new Person();
person.Name = sourcePerson.Name;
person.Address = new Address();
person.Address.Street = sourcePerson.Address.Street;

しかし、Person オブジェクトが既にある場合は、それを埋めたいだけです。また、Person オブジェクトに既に Address が設定されている場合は、その Address オブジェクトも置き換えずに埋めたいと思います。基本的に:

var person = GetExistingPerson();
...
Mapper.Map(sourcePerson, person); // this will fill person object
// here is what it does now (internally):
person.Name = sourcePerson.Name;
person.Address = new Address();
person.Address.Street = sourcePerson.Address.Street; // <-- not what I want
// here is what I do want to happen:
person.Name = sourcePerson.Name;
person.Address.Street = sourcePerson.Address.Street; // i.e. not override Address, but fill it.

理想的には、これを自動的に把握するように AutoMapper を構成できるようにしたいと考えています。つまり、Address が null でない場合は作成して設定し、null でない場合は更新します。

現在、次のように AfterMap を使用しています。

var map = Mapper.Create<SourcePerson, Person>();
map.ForSource(src=>src.Name,opt=>opt.MapFrom(dst=>dst.Name));
map.AfterMap((srcPerson, dstPerson) => {
    if (dstPerson.Address == null) dstPerson.Address = Mapper.Map<Address>(srcPerson.Address); // set
    else Mapper.Map(srcPerson.Address, dstPerson.Address); // fill
});

Addressオブジェクトは自己追跡エンティティであり、オーバーライドできない状態であるため、これを行います。

AfterMap を使用しないようにコードをリファクタリングする方法はありますか?

4

0 に答える 0