映射繼承有兩個功能:javascript
繼承的配置是可選擇的,你能夠在基類中使用Include
來指定可被繼承的映射配置或者在派生類使用IncludeBase
來指定:java
CreateMap<BaseEntity, BaseDto>()
.Include<DerivedEntity, DerivedDto>()
.ForMember(dest => dest.SomeMember, opt => opt.MapFrom(src => src.OtherMember)); CreateMap<DerivedEntity, DerivedDto>();
或者app
CreateMap<BaseEntity, BaseDto>()
.ForMember(dest => dest.SomeMember, opt => opt.MapFrom(src => src.OtherMember)); CreateMap<DerivedEntity, DerivedDto>() .IncludeBase<BaseEntity, BaseDto>();
在上面的狀況中,派生的映射繼承於基礎映射配置中的自定義映射配置。ui
用法:google
public class Order { } public class OnlineOrder : Order { } public class MailOrder : Order { } public class OrderDto { } public class OnlineOrderDto : OrderDto { } public class MailOrderDto : OrderDto { } Mapper.Initialize(cfg => { cfg.CreateMap<Order, OrderDto>() .Include<OnlineOrder, OnlineOrderDto>() .Include<MailOrder, MailOrderDto>(); cfg.CreateMap<OnlineOrder, OnlineOrderDto>(); cfg.CreateMap<MailOrder, MailOrderDto>(); }); // 執行映射 var order = new OnlineOrder(); var mapped = Mapper.Map(order, order.GetType(), typeof(OrderDto)); Assert.IsType<OnlineOrderDto>(mapped);
須要映射的對象是OnlineOrder
,AutoMapper
找到一個比OrderDto
更具體的OnlineOrder
映射,就自動選擇了OnlineOrder
。spa
你能夠使用在派生類中指定須要繼承的映射來代替在基類中配置須要被繼承的映射:code
Mapper.Initialize(cfg => { cfg.CreateMap<Order, OrderDto>() .ForMember(o => o.Id, m => m.MapFrom(s => s.OrderId)); cfg.CreateMap<OnlineOrder, OnlineOrderDto>() .IncludeBase<Order, OrderDto>(); cfg.CreateMap<MailOrder, MailOrderDto>() .IncludeBase<Order, OrderDto>(); });
一個屬性有多種映射途徑,它們的優先級以下:對象
爲了演示,咱們修改上面顯示的類繼承
//域對象 public class Order { } public class OnlineOrder : Order { public string Referrer { get; set; } } public class MailOrder : Order { } //數據傳輸對象 public class OrderDto { public string Referrer { get; set; } } //映射 Mapper.Initialize(cfg => { cfg.CreateMap<Order, OrderDto>() .Include<OnlineOrder, OrderDto>() .Include<MailOrder, OrderDto>() .ForMember(o=>o.Referrer, m=>m.Ignore()); cfg.CreateMap<OnlineOrder, OrderDto>(); cfg.CreateMap<MailOrder, OrderDto>(); }); // 執行映射 var order = new OnlineOrder { Referrer = "google" }; var mapped = Mapper.Map(order, order.GetType(), typeof(OrderDto)); Assert.Equals("google", mapped.Referrer);
請注意,在的映射配置中,咱們忽略了Referrer
(由於在order的基類中找不到),並且它有一個更高優先級的轉換映射,因此這個成員沒有被映射。接口
總得來講,這個特徵使得AutoMapper
使用繼承變得更天然。