Вы можете использовать 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));
В случае, если будет иметь больше моделей источников, которые можно использовать другое представление (List, словарь или что-то еще), собирающие все эти модели вместе, как источник.
Приведенный выше код должен быть помещен в некоторый файл 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);
// Now map the remaining source objects
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; }
}
@Andrei в то время как я согласен, кажется, похоже, разница в задаче он пытается решать.также трудно понять из этого вопроса, как это применимо к этому. –
Почему бы не сделать 'PeoplePhoneDto' членом' People' и 'Phone'? – crush
Потому что это не то, что я хочу разоблачить. –