Tuple
이것을 위해 사용할 수 있습니다 .
Mapper.CreateMap<Tuple<People, Phone>, PeoplePhoneDto>()
.ForMember(d => d.FirstName, opt => opt.MapFrom(s => s.Item1.FirstName))
.ForMember(d => d.LastName, opt => opt.MapFrom(s => s.Item1.LastName))
.ForMember(d => d.Number, opt => opt.MapFrom(s => s.Item2.Number ));
더 많은 소스 모델이있는 경우 다른 표현 (목록, 사전 또는 기타)을 사용하여 이러한 모든 모델을 소스로 모을 수 있습니다.
위의 코드는 일부 AutoMapperConfiguration 파일에 배치하고 한 번 전체적으로 설정 한 다음 적용 가능한 경우 사용하는 것이 좋습니다.
AutoMapper는 기본적으로 단일 데이터 소스 만 지원합니다. 따라서 예를 들어 두 개의 소스 모델에 동일한 이름의 속성이있는 경우 어떻게 알 수 있습니까?
이를 달성하기위한 몇 가지 해결 방법이 있습니다.
public static class EntityMapper
{
public static T Map<T>(params object[] sources) where T : class
{
if (!sources.Any())
{
return default(T);
}
var initialSource = sources[0];
var mappingResult = Map<T>(initialSource);
if (sources.Count() > 1)
{
Map(mappingResult, sources.Skip(1).ToArray());
}
return mappingResult;
}
private static void Map(object destination, params object[] sources)
{
if (!sources.Any())
{
return;
}
var destinationType = destination.GetType();
foreach (var source in sources)
{
var sourceType = source.GetType();
Mapper.Map(source, destination, sourceType, destinationType);
}
}
private static T Map<T>(object source) where T : class
{
var destinationType = typeof(T);
var sourceType = source.GetType();
var mappingResult = Mapper.Map(source, sourceType, destinationType);
return mappingResult as T;
}
}
그리고:
var peoplePhoneDto = EntityMapper.Map<PeoplePhoneDto>(people, phone);
그러나 솔직히 말해서 이미 몇 년 동안 AutoMapper를 사용하고 있지만 여러 소스의 매핑을 사용할 필요가 없었습니다. 예를 들어 단일 뷰 모델에 여러 비즈니스 모델이 필요한 경우 이러한 모델을 뷰 모델 클래스에 포함했습니다.
따라서 귀하의 경우에는 다음과 같이 보일 것입니다.
public class PeoplePhoneDto {
public People People { get; set; }
public Phone Phone { get; set; }
}