Podrías usar un Tuple
para esto:
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 ));
En caso de que tenga más modelos fuente, puede usar una representación diferente (Lista, Diccionario o algo más) que reunirá todos estos modelos como fuente.
El código anterior debe colocarse preferiblemente en algún archivo de configuración de AutoMapper, establecerse una vez y de forma global y luego usarse cuando corresponda.
AutoMapper de forma predeterminada admite solo una fuente de datos. Entonces, no hay posibilidad de configurar directamente múltiples fuentes (sin envolverlo en una colección) porque entonces, ¿cómo sabríamos qué en caso de que, por ejemplo, dos modelos de fuente tengan propiedades con los mismos nombres?
Aunque hay alguna solución para lograr esto:
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;
}
}
Y entonces:
var peoplePhoneDto = EntityMapper.Map<PeoplePhoneDto>(people, phone);
Pero para ser bastante honesto, a pesar de que estoy usando AutoMapper desde hace algunos años, nunca he tenido la necesidad de usar mapas de múltiples fuentes. En los casos en los que, por ejemplo, necesitaba varios modelos de negocio en mi modelo de vista única, simplemente incrustaba estos modelos dentro de la clase de modelo de vista.
Entonces, en su caso, se vería así:
public class PeoplePhoneDto {
public People People { get; set; }
public Phone Phone { get; set; }
}