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"
)。配置扁平化仅可通过流畅配置实现。
额外的配置选项
其他基于属性的配置选项包括:
MapAtRuntimeAttribute
MappingOrderAttribute
NullSubstituteAttribute
UseExistingValueAttribute
ValueConverterAttribute
ValueResolverAttribute
每个选项都对应相同的流畅配置映射选项。