AutoMapper 属性映射
除流畅配置外,还可以通过属性声明和配置映射。属性映射可以补充或替代流畅映射配置。
类型映射配置
为了搜索要配置的映射,使用 AddMaps 方法:
var configuration = new MapperConfiguration(cfg => cfg.AddMaps("MyAssembly"));
var mapper = new Mapper(configuration);
AddMaps 会查找流畅映射配置(Profile 类)和基于属性的映射。
要声明一个属性映射,请使用 AutoMapAttribute 装饰目标类型:
[AutoMap(typeof(Order))]
public class OrderDto {
// 目标成员
这等同于 CreateMap<Order, OrderDto>() 配置。
自定义类型映射配置
要自定义整体类型映射配置,可以在 AutoMapAttribute 上设置以下属性:
ReverseMap(bool)ConstructUsingServiceLocator(bool)MaxDepth(int)PreserveReferences(bool)DisableCtorValidation(bool)IncludeAllDerived(bool)TypeConverter(Type)AsProxy(bool)
这些都对应于类似的流畅映射配置选项。仅需要 sourceType 值来进行映射。
成员配置
对于基于属性的映射,您可以使用额外的配置来装饰单个成员。由于 C# 中属性的限制(例如,不支持表达式),可用的配置选项有些局限。
基于成员的属性在 AutoMapper.Configuration.Annotations 命名空间中声明。
如果基于属性的配置不可用或不起作用,您可以结合使用属性和配置文件的映射(尽管这可能会令人困惑)。
忽略成员
使用 IgnoreAttribute 忽略单个目标成员的映射和/或验证:
using AutoMapper.Configuration.Annotations;
[AutoMap(typeof(Order))]
public class OrderDto {
[Ignore]
public decimal Total { get; set; }
重定向到不同的源成员
无法在属性中使用 MapFrom 和表达式,但 SourceMemberAttribute 可以重定向到单独命名的成员:
using AutoMapper.Configuration.Annotations;
[AutoMap(typeof(Order))]
public class OrderDto {
[SourceMember("OrderTotal")]
public decimal Total { get; set; }
或者使用 nameof 运算符:
using AutoMapper.Configuration.Annotations;
[AutoMap(typeof(Order))]
public class OrderDto {
[SourceMember(nameof(Order.OrderTotal))]
public decimal Total { get; set; }
您不能使用此属性进行扁平化,只能重定向源类型成员(即,名称中没有 "Order.Customer.Office.Name" )。配置扁平化仅可通过流畅配置实现。
额外的配置选项
其他基于属性的配置选项包括:
MapAtRuntimeAttributeMappingOrderAttributeNullSubstituteAttributeUseExistingValueAttributeValueConverterAttributeValueResolverAttribute
每个选项都对应相同的流畅配置映射选项。
抠丁客
