您可以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; }
}