ReverseMap 反转映射

AutoMapper ReverseMap 反转映射(反向映射)

概念

ReverseMap():基于已有的正向映射,自动生成反向映射配置

从 AutoMapper 6.1+ 支持,同时支持 Unflattening(反扁平化):Dto扁平字段可以反向写回实体里面嵌套对象的属性。

实体与DTO

// 业务实体(嵌套对象)
public class Order
{
    public decimal Total { get; set; }
    public Customer Customer { get; set; }
}

public class Customer
{
    public string Name { get; set; }
}

// DTO:扁平化,把 Customer.Name 压扁成 CustomerName
public class OrderDto
{
    public decimal Total { get; set; }
    public string CustomerName { get; set; }
}Code language: JavaScript (javascript)

配置 ReverseMap

Mapper.Initialize(cfg =>
{
    // Order → OrderDto 正向映射,加上 ReverseMap() 自动生成 OrderDto → Order反向映射
    cfg.CreateMap<Order, OrderDto>()
       .ReverseMap();
});Code language: JavaScript (javascript)
  • 正向:OrderOrderDto:把Order.Customer.Name 扁平化赋值给 OrderDto.CustomerName
  • 反向:OrderDtoOrderUnflattening反扁平化):把Dto的CustomerName写回到 Order.Customer.Name,自动实例化Customer对象。

完整示例

// 原始实体
var customer = new Customer
{
    Name = "Bob"
};
var order = new Order
{
    Customer = customer,
    Total = 15.8m
};

// 正向映射 Entity → DTO
var orderDto = Mapper.Map<Order, OrderDto>(order);

// 修改DTO的扁平字段
orderDto.CustomerName = "Joe";

// 反向映射 DTO → Entity,反扁平化
Mapper.Map(orderDto, order);

// 输出 Joe,反向把CustomerName写回嵌套对象 Customer.Name
Console.WriteLine(order.Customer.Name);Code language: JavaScript (javascript)

ReverseMap 自定义反向规则

如果反向映射需要额外配置,在ReverseMap()后面链式调用ForMember

cfg.CreateMap<Order, OrderDto>()
    .ForMember(dto => dto.Total, opt => opt.MapFrom(src => src.Total))
    .ReverseMap()
    // 只针对反向映射 OrderDto → Order 的配置
    .ForMember(dest => dest.Total, opt => opt.Ignore());Code language: JavaScript (javascript)

Profile类写法

public class OrderMappingProfile : Profile
{
    public OrderMappingProfile()
    {
        CreateMap<Order, OrderDto>()
            .ReverseMap();
    }
}Code language: HTML, XML (xml)

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注