从6.1.0开始,AutoMapper现在支持更丰富的反向映射支持。 鉴于我们的实体:
public class Order {
public decimal Total { get; set; }
public Customer Customer { get; set; }
}
public class Customer {
public string Name { get; set; }
}
我们可以把它变成一个DTO:
public class OrderDto {
public decimal Total { get; set; }
public string CustomerName { get; set; }
}
我们可以映射两个方向,包括复杂化:
Mapper.Initialize(cfg => {
cfg.CreateMap<Order, OrderDto>()
.ReverseMap();
});
通过调用ReverseMap,AutoMapper会创建一个反向映射配置,其中包含复杂化:
var customer = new Customer {
Name = "Bob"
};
var order = new Order {
Customer = customer,
Total = 15.8m
};
var orderDto = Mapper.Map<Order, OrderDto>(order);
orderDto.CustomerName = "Joe";
Mapper.Map(orderDto, order);
order.Customer.Name.ShouldEqual("Joe");
Unflattening仅为ReverseMap配置。 如果你想解unflattening,你必须配置Entity -> Dto,然后调用ReverseMap,从Dto -> Entity创建一个unflattening的类型映射配置。
自定义反向映射
AutoMapper会根据原来的扁平化自动将Customer.Name反向映射到CustomerName。 如果您使用MapFrom,AutoMapper将尝试反转映射:
cfg.CreateMap<Order, OrderDto>()
.ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
.ReverseMap();
只要MapFrom路径是成员访问器,AutoMapper将从相同路径(CustomerName => Customer.Name) unflatten 。
如果您需要自定义这个,对于反向映射,您可以使用ForPath:
cfg.CreateMap<Order, OrderDto>()
.ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
.ReverseMap()
.ForPath(s => s.Customer.Name, opt => opt.MapFrom(src => src.CustomerName));
对于大多数情况下,你不应该需要这个,因为原来的MapFrom将会颠倒过来。 当获取和设置值的路径不同时使用ForPath。
如果您不需要unflattening行为,则可以将此调用移除,链式调用到ReverseMap并创建两个单独的映射。 或者,您可以使用Ignore:
cfg.CreateMap<Order, OrderDto>()
.ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
.ReverseMap()
.ForPath(s => s.Customer.Name, opt => opt.Ignore());
本文介绍AutoMapper 6.1.0版本开始支持的丰富反向映射特性,包括如何配置实体与DTO间的双向映射,以及如何进行复杂的自定义反向映射。
77

被折叠的 条评论
为什么被折叠?



