반응형
Automapper-다중 객체 소스 및 하나의 대상
자동 매퍼를 사용하여 여러 개체 (db 클래스를 ui 개체로)를 매핑합니다.
지도 1 :
Mapper.CreateMap<sourceone, destination>().ForMember(sss => sss.one, m => m.MapFrom(source => source.abc));
지도 2 :
Mapper.CreateMap<sourcetwo, destination>().ForMember(sss => sss.two, m => m.MapFrom(source => source.xyz));
destination d = new destination();
//지도 1
d = AutoMapper.Mapper.Map<sourceone, destination>(sourceone);
//지도 2
d = AutoMapper.Mapper.Map<sourcetwo, destination>(sourcetwo);
일단 'Map 2'를 호출하면 Map 1을 사용하여 채워진 값이 손실됩니다. (즉, destination.one이 비어 있음). 이 문제를 어떻게 해결합니까?
Map
소스 및 대상 개체를 사용하는 오버로드가 있습니다.
d = AutoMapper.Mapper.Map<sourceone, destination>(sourceone);
/* Pass the created destination to the second map call: */
AutoMapper.Mapper.Map<sourcetwo, destination>(sourcetwo, d);
mapper.MergeInto<PersonCar>(person, car)
확장 방법, 단순 및 일반 버전으로 허용되는 답변으로 :
public static TResult MergeInto<TResult>(this IMapper mapper, object item1, object item2)
{
return mapper.Map(item2, mapper.Map<TResult>(item1));
}
public static TResult MergeInto<TResult>(this IMapper mapper, params object[] objects)
{
var res = mapper.Map<TResult>(objects.First());
return objects.Skip(1).Aggregate(res, (r, obj) => mapper.Map(obj, r));
}
각 입력 유형에 대한 매핑을 구성한 후 :
IMapper mapper = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Person, PersonCar>();
cfg.CreateMap<Car, PersonCar>();
}).CreateMapper();
public class Person
{
public string Name { get; set; }
public string PhNo { get; set; }
}
public class Company
{
public int EmpNo { get; set; }
public string Title { get; set; }
}
public class PersonCompany
{
public string Name { get; set; }
public string PhNo { get; set; }
public int EmpNo { get; set; }
public string Title { get; set; }
}
//you can test as below
var pMap = Mapper.CreateMap<Person,PersonCompany>();
pMap.ForAllMembers(d => d.Ignore());
pMap.ForMember(d => d.Name, opt => opt.MapFrom(s => s.Name))
.ForMember(d => d.PhNo, opt => opt.MapFrom(s => s.PhNo));
var cMap = Mapper.CreateMap<Company, PersonCompany>();
cMap.ForAllMembers(d => d.Ignore());
cMap.ForMember(d => d.EmpNo, opt => opt.MapFrom(s => s.EmpNo))
.ForMember(d => d.Title, opt => opt.MapFrom(s => s.Title));
var person = new Person { Name = "PersonName", PhNo = "212-000-0000" };
var personCompany = Mapper.Map<Person,PersonCompany>(person);
var company = new Company { Title = "Associate Director", EmpNo = 10001 };
personCompany = Mapper.Map(company, personCompany);
Console.WriteLine("personCompany.Name={0}", personCompany.Name);
Console.WriteLine("personCompany.PhNo={0}", personCompany.PhNo);
Console.WriteLine("personCompany.EmpNo={0}", personCompany.EmpNo);
Console.WriteLine("personCompany.Title={0}", personCompany.Title);
나에 따르면 수락 된 답변에 설명 된대로 대상 개체의 인스턴스를 가져 오는 오버로드 된 Map 메서드를 호출하지 않아야합니다. 이렇게하면 매핑 구성 ( Mapper.Configuration.AssertConfigurationIsValid()
) 을 테스트 / 검증 할 수 없으며 매핑 에 '무시'를 많이 추가합니다.
A very simple solution is to create a composite type holding source references and define your mapping to the destination based on that composite type.
Something like:
public class SourceOneTwo
{
public SourceOne SourceOne { get; set; }
public SourceTwo SourceTwo { get; set; }
}
static void Main(string[] args)
{
var config = new MapperConfiguration(cfg =>
cfg.CreateMap<SourceOneTwo, Destination>()
.ForMember(dest => dest.one, m => m.MapFrom(source => source.SourceOne.abc))
.ForMember(dest => dest.two, m => m.MapFrom(source => source.SourceTwo.xyz)));
config.AssertConfigurationIsValid();
}
ReferenceURL : https://stackoverflow.com/questions/19544133/automapper-multi-object-source-and-one-destination
반응형
'IT Share you' 카테고리의 다른 글
연결할 소스 외부 참조를 찾을 수 없습니다. (0) | 2020.12.15 |
---|---|
std :: advance와 std :: next의 차이점은 무엇입니까? (0) | 2020.12.15 |
Subversion을위한 더 나은 병합 도구 (0) | 2020.12.15 |
C ++ 클래스의 멤버는 어떻게 주문해야합니까? (0) | 2020.12.15 |
Python 프로그램 종료시 하위 프로세스가 종료되었는지 확인 (0) | 2020.12.15 |