Automapper- 속성 세터 대신 생성자 매개 변수에 매핑하는 방법
-
19-09-2019 - |
문제
대상 세터가 비공개 인 경우 대상 객체의 생성자를 사용하여 객체에 매핑 할 수 있습니다. automapper를 사용하여 어떻게해야합니까?
해결책
사용 ConstructUsing
이를 통해 매핑 중에 사용할 생성자를 지정할 수 있습니다. 그러나 다른 모든 속성은 규칙에 따라 자동으로 매핑됩니다.
또한 이것은 다릅니다 ConvertUsing
이 변환에서 사용은 컨벤션을 통해 계속 매핑되지 않으며 대신 매핑을 완전히 제어 할 수 있습니다.
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; }
}
}
다른 팁
당신은 사용해야합니다 Map
대상을 설정할 수있는 메소드. 예를 들어 :
Mapper.CreateMap<ObjectFrom, ObjectTo>()
var from = new ObjectFrom { Name = "Jon", Age = 25 };
var to = Mapper.Map(from, new ObjectTo(param1));
모범 사례는 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)));
이 답변을 작성할 때 Automapper는 자동 으로이 작업을 수행합니다 (간단한 CreateMap<>()
호출) 속성이 생성자 매개 변수와 일치하는 경우. 물론 일이 일치하지 않으면 .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>();
}
}
참고 : 이것은 당신이 사용하고 있다고 가정합니다 프로필 Automapper Mappings를 설정합니다.
아래와 같이 사용하면 올바른 개체가 생성됩니다.
var model = new PersonViewModel
{
Id = 1
Name = "John Smith"
}
// will correctly call the (id, name) constructor of Person
_mapper.Map<Person>(model);
오프전의 Automapper Construction에 대한 자세한 내용을 읽을 수 있습니다. Github의 위키
제휴하지 않습니다 StackOverflow