15. AutoMapper 之映射繼承(Mapping Inheritance)

 

映射繼承(Mapping Inheritance)

映射繼承有兩個功能: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); 

須要映射的對象是OnlineOrderAutoMapper找到一個比OrderDto更具體的OnlineOrder映射,就自動選擇了OnlineOrderspa

在派生類中指定繼承

你能夠使用在派生類中指定須要繼承的映射來代替在基類中配置須要被繼承的映射: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>(); }); 

繼承映射優先級

一個屬性有多種映射途徑,它們的優先級以下:對象

  • 顯式映射 (使用 .MapFrom())
  • 繼承的顯式映射
  • 忽略屬性映射
  • 轉換映射 (匹配的經過轉換的屬性)

爲了演示,咱們修改上面顯示的類繼承

//域對象 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使用繼承變得更天然。

相關文章
相關標籤/搜索