一尘不染

AutoMapper从多个来源转换

c#

假设我有两个模型类:

public class People {
   public string FirstName {get;set;}
   public string LastName {get;set;}
}

还有一个班级的电话:

public class Phone {
   public string Number {get;set;}
}

我想这样转换为PeoplePhoneDto:

public class PeoplePhoneDto {
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public string PhoneNumber {get;set;}
}

假设在我的控制器中,我有:

var people = repository.GetPeople(1);
var phone = repository.GetPhone(4);

// normally, without automapper I would made
return new PeoplePhoneDto(people, phone) ;

我似乎找不到这种情况的任何示例。这可能吗 ?

注意:仅针对此问题,示例不是真实的。


阅读 397

收藏
2020-05-19

共1个答案

一尘不染

您无法直接将多个源映射到单个目标-
您应按照安德鲁·惠特克Andrew
Whitaker)的
回答中的说明,一一应用地图。因此,您必须定义所有映射:

Mapper.CreateMap<People, PeoplePhoneDto>();
Mapper.CreateMap<Phone, PeoplePhoneDto>()
        .ForMember(d => d.PhoneNumber, a => a.MapFrom(s => s.Number));

然后通过这些映射中的任何一个创建目标对象,并将其他映射应用于创建的对象。并且可以通过非常简单的扩展方法来简化此步骤:

public static TDestination Map<TSource, TDestination>(
    this TDestination destination, TSource source)
{
    return Mapper.Map(source, destination);
}

用法很简单:

var dto = Mapper.Map<PeoplePhoneDto>(people)
                .Map(phone);
2020-05-19