Sie könnten ein Tuple
dafür verwenden:
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 ));
Falls Sie mehr Quellmodelle hätten, können Sie eine andere Darstellung (Liste, Wörterbuch oder etwas anderes) verwenden, die alle diese Modelle als Quelle zusammenfasst.
Der obige Code sollte vorzugsweise in einer AutoMapperConfiguration-Datei abgelegt, einmal und global festgelegt und dann gegebenenfalls verwendet werden.
AutoMapper unterstützt standardmäßig nur eine einzige Datenquelle. Es gibt also keine Möglichkeit, mehrere Quellen direkt festzulegen (ohne sie in eine Sammlung einzuschließen), denn wie würden wir dann wissen, was passiert, wenn beispielsweise zwei Quellmodelle Eigenschaften mit demselben Namen haben?
Es gibt jedoch einige Problemumgehungen, um dies zu erreichen:
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;
}
}
Und dann:
var peoplePhoneDto = EntityMapper.Map<PeoplePhoneDto>(people, phone);
Aber um ganz ehrlich zu sein, obwohl ich AutoMapper bereits seit einigen Jahren verwende, musste ich nie Mapping aus mehreren Quellen verwenden. In Fällen, in denen ich beispielsweise mehrere Geschäftsmodelle in meinem Einzelansichtsmodell benötigte, habe ich diese Modelle einfach in die Ansichtsmodellklasse eingebettet.
In Ihrem Fall würde es also so aussehen:
public class PeoplePhoneDto {
public People People { get; set; }
public Phone Phone { get; set; }
}