AutoMapper官方文档(十五)【映射继承】
2017-11-29 09:31
399 查看
映射继承有两个功能:
继承基类配置是
或者
在上面的每种情况下,派生映射从基本映射配置继承自定义映射配置。
你会注意到,因为映射对象是一个
为了演示这个,让我们修改上面显示的类
请注意,在我们的映射配置中,我们忽略了
总的来说,这个特性应该使
从基类或接口配置继承映射配置 运行时多态映射
继承基类配置是
opt-in,您可以显式指定要从包含基本类型的配置继承的映射,也可以在包含
IncludeBase的派生类型配置中指定该映射::
CreateMap<BaseEntity, BaseDto>() .Include<DerivedEntity, DerivedDto>() .ForMember(dest => dest.SomeMember, opt => opt.MapFrom(src => src.OtherMember)); CreateMap<DerivedEntity, DerivedDto>();
或者
CreateMap<BaseEntity, BaseDto>() .ForMember(dest => dest.SomeMember, opt => opt.MapFrom(src => src.OtherMember)); CreateMap<DerivedEntity, DerivedDto>() .IncludeBase<BaseEntity, BaseDto>();
在上面的每种情况下,派生映射从基本映射配置继承自定义映射配置。
运行时多态性
示例: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映射,并自动选择它。
在派生类中指定继承
您可以从派生类中指定继承,而不是从基类中配置继承: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>(); });
继承映射优先级
这引入了额外的复杂性,因为有多种方法可以映射属性。 这些来源的优先顺序如下显式映射 (using .MapFrom()) 继承的显式映射 忽略属性映射 约定映射(通过约定匹配的属性)
为了演示这个,让我们修改上面显示的类
//领域对象 public class Order { } public class OnlineOrder : Order { public string Referrer { get; set; } } public class MailOrder : Order { } //Dtos 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能够使用继承的类更加自然。
相关文章推荐
- AutoMapper官方文档(八)【内联映射】
- AutoMapper官方文档(十)【嵌套映射】
- AutoMapper官方文档(十八)【条件映射,开放泛型,了解你的映射】
- NHibernate官方文档——第八章 继承映射(Inheritance Mapping)
- AutoMapper官方文档(四)【扁平化(分割)映射】
- AutoMapper官方文档(五)【反向映射和复杂化】
- Python3.2官方文档翻译--继承
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
- Python3.2官方文档翻译-多重继承和私有变量
- MyBatis 官方文档学习2---XML 映射配置文件
- hibernate3学习笔记(十五)|继承映射
- [SQLObject官方文档] 继承
- AutoMapper官方文档(十三)【值转换器,Null替换,Map行为前后】
- ABP官方文档(十三)【对象之间的映射】
- Hibernate 官方文档(入门) 第一章 1.2 - Mapping associations 映射联系
- AutoMapper官方文档(十一)【自定义类型转换器】
- AutoMapper官方文档(十六)【可查询扩展】
- hibernate3学习笔记(十五)|继承映射
- ABP官方文档翻译 2.7 对象到对象的映射
- AutoMapper官方文档(九)【列表和数组】