两个对象属性值映射 之 AutoMapper
- .Net
- 2020-07-18
- 16热度
- 0评论
什么是AutoMapper?
AutoMapper是一个轻量级的类库,主要功能是把一个对象转换成另外一个对象,而避免我们每次都手工去转换。
简单来说就是将一个对象的属性值映射到另一个对象。摆脱了繁琐的赋值过程(最常见就是DbModel--ViewModel)
常见使用场景:
a、对外服务接口,把逻辑层的实体转换成服务消费者需要的字段。
b、UI展现层,把业务对象转换成UI需要展现的字段。
c、用户的输入输出,把DTO与领域模型互转。
一、基本使用
1、使用NuGet安装AutoMapper
2、AutoMapperConfig类
namespace Test
{
public class AutoMapperConfig
{
public static void RegisterMappings()
{
//初始化映射
Mapper.Initialize(cfg =>
{
//映射关系
cfg.CreateMap<Order, OrderDto>();
cfg.CreateMap<TB_Test1, TB_Test2>()).ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.MingCheng));
});
}
}
}
3、启动配置
使用静态全局mapper注册的话,应该放在应用程序启动的时候。
比如ASP.NET的Global.asax文件中Application_Start()方法:
protected void Application_Start()
{
AutoMapperConfig.RegisterMappings();
}
4、验证配置是否有效,无效则抛出异常
Mapper.AssertConfigurationIsValid();
5、使用
//OrderDto是目标类型,order是源对象。
OrderDto dto = Mapper.Map<OrderDto>(order);
二、映射规则,AutoMapper默认是根据属性名称自动与源进行匹配、赋值,mapper不区分大小写。
1、自动分割映射(Flattening,内部匹配根据帕斯卡拼写法(PascalCase))
实际中我们经常需要把一个复杂对象映射一个简单对象,给UI使用,例:
public class Order
{
public Customer Customer { get; set; }
public decimal GetTotal()
{
return 10*10;
}
}
public class Customer
{
public string Name { get; set; }
}
然后匹配Order对象到一个简单的OrderDto,仅包含我们需要的字段:
public class OrderDto
{
public string CustomerName { get; set; }
public decimal Total { get; set; }
}
当我们使用AutoMapper创建Order/OrderDto映射配置时,AutoMapper映射器会尝试在Order中,寻找名称匹配的成员,有3种匹配方式:
a、名称相同的属性进行映射,不区分大小写。
b、带Get前缀的方法进行映射。如例子中:映射器会把Order中的GetTotal分割成Get、Total 2个词,把分割出来的Total与OrderDto中的Order进行匹配映射。
c、目标类型属性分割。如例子中: 映射器会把OrderDto中的CustomerName分割成Customer、Name。然后在Order中去Customer类属性中查找Name的属性。
2、自定义字段映射(Projection)
自动分割映射能预判源对象到目标对象的匹配,但不能自定义配置映射。AutoMapper在构造目标对象时,会自动按照规则进行目标与源属性分割匹配。所以自动分割映射虽然方便智能,但却不是那么精确可控制的。 在很多场景下,我们更需要的是把A属性拆分映射B、C 2个属性上,或单独映射D属性上。
例如:
cfg.CreateMap<TB_Test1, TB_Test2>()).ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.MingCheng));
ForMember方法允许我们指定2个action委托去配置每个成员的映射关系。 在上面的例子中,我们在源表达式使用了MapFrom方法去执行源值与目标成员的映射。这个MapFrom方法接受一个lambda表达式为参数,它在对象映射期间进行求值,即惰性求值。MapFrom参数可以是任意一个func的lambda表达式。
三、验证配置(Configuration validation)
Mapper.AssertConfigurationIsValid();
AssertConfigurationIsValid执行验证期间,AutoMapper会检查每个目标类型的属性,逐一去匹配源中是否存在合适相等的类型。
验证失败有4种解决方法:
1、修改源和目标名称一致。
2、自定义值解析器
3、指定字段映射(Projection)
4、使用忽略(Ignore())选项
Mapper.CreateMap<TB_Test1, TB_Test2>().ForMember(dest => dest.Name, opt => opt.Ignore());
其他实现方式:两个对象属性值映射 之 反射赋值

鲁ICP备19063141号
鲁公网安备 37010302000824号