宛先セッターがプライベートの場合、宛先オブジェクトのコンストラクターを使用してオブジェクトにマップしたい場合があります。Automapper を使用してこれを行うにはどうすればよいでしょうか。
5 に答える
使用するConstructUsing
これにより、マッピング中に使用するコンストラクターを指定できます。ただし、他のすべてのプロパティは、規則に従って自動的にマップされます。
ConvertUsing
これは、convert using が規則を介してマップを続行しないという点で異なることに注意してください。代わりに、マッピングを完全に制御できます。
Mapper.CreateMap<ObjectFrom, ObjectTo>()
.ConstructUsing(x => new ObjectTo(arg0, arg1, etc));
...
using AutoMapper;
using NUnit.Framework;
namespace UnitTests
{
[TestFixture]
public class Tester
{
[Test]
public void Test_ConstructUsing()
{
Mapper.CreateMap<ObjectFrom, ObjectTo>()
.ConstructUsing(x => new ObjectTo(x.Name));
var from = new ObjectFrom { Name = "Jon", Age = 25 };
ObjectTo to = Mapper.Map<ObjectFrom, ObjectTo>(from);
Assert.That(to.Name, Is.EqualTo(from.Name));
Assert.That(to.Age, Is.EqualTo(from.Age));
}
}
public class ObjectFrom
{
public string Name { get; set; }
public int Age { get; set; }
}
public class ObjectTo
{
private readonly string _name;
public ObjectTo(string name)
{
_name = name;
}
public string Name
{
get { return _name; }
}
public int Age { get; set; }
}
}
ベスト プラクティスは、AutoMapper http://docs.automapper.org/en/stable/Construction.htmlから文書化されたアプローチを使用することです。
public class SourceDto
{
public SourceDto(int valueParamSomeOtherName)
{
Value = valueParamSomeOtherName;
}
public int Value { get; }
}
Mapper.Initialize(cfg => cfg.CreateMap<Source, SourceDto>()
.ForCtorParam(
"valueParamSomeOtherName",
opt => opt.MapFrom(src => src.Value)
)
);
目的地を設定できる方法を使用する必要Map
があります。例えば :
Mapper.CreateMap<ObjectFrom, ObjectTo>()
var from = new ObjectFrom { Name = "Jon", Age = 25 };
var to = Mapper.Map(from, new ObjectTo(param1));
この回答を書いている時点でCreateMap<>()
、プロパティがコンストラクターのパラメーターと一致する場合、AutoMapper はこれを (簡単な呼び出しで) 自動的に行います。もちろん、物事が一致しない場合.ConstructUsing(...)
は、使用する方法があります。
public class PersonViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Person
{
public Person (int id, string name)
{
Id = id;
Name = name;
}
public int Id { get; }
public string Name { get; }
}
public class PersonProfile : Profile
{
public PersonProfile()
{
CreateMap<PersonViewModel, Person>();
}
}
注: これは、プロファイルを使用してオートマッパー マッピングをセットアップしていることを前提としています。
以下のように使用すると、正しいオブジェクトが生成されます。
var model = new PersonViewModel
{
Id = 1
Name = "John Smith"
}
// will correctly call the (id, name) constructor of Person
_mapper.Map<Person>(model);
オートマッパーの構築について詳しくは、GitHub の公式 wiki を参照してください。