您的位置:首页 > 移动开发

AutoMapper官方文档(五)【反向映射和复杂化】

2017-11-28 10:22 155 查看
从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());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: