zoukankan      html  css  js  c++  java
  • 继承映射

    Mapping Inheritance

    AutoMapper 1.1 had a method called .Include<> when creating your maps which allowed AutoMapper to automatically select the most derived mapping for a class.

    Take:

        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>();
        });
    
        // Perform Mapping
        var order = new OnlineOrder();
        var mapped = Mapper.Map(order, order.GetType(), typeof(OrderDto));
        Assert.IsType<OnlineOrderDto>(mapped);
    

    You will notice that because the mapped object is a OnlineOrder, AutoMapper has seen you have a more specific mapping for OnlineOrder than OrderDto, and automatically chosen that.

    Specifying inheritance in derived classes

    Instead of configuring inheritance from the base class, you can specify inheritance from the derived classes:

    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>();
    });
    

    Inheritance Mapping Priorities

    This introduces additional complexity because there are multiple ways a property can be mapped. The priority of these sources are as follows

    • Explicit Mapping (using .MapFrom())
    • Inherited Explicit Mapping
    • Ignore Property Mapping
    • Convention Mapping (Properties that are matched via convention)

    To demonstrate this, lets modify our classes shown above

        //Domain Objects
        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; }
        }
    
        //Mappings
        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>();
        });
    
        // Perform Mapping
        var order = new OnlineOrder { Referrer = "google" };
        var mapped = Mapper.Map(order, order.GetType(), typeof(OrderDto));
        Assert.Equals("google", mapped.Referrer);
    

    Notice that in our mapping configuration, we have ignored Referrer (because it doesn't exist in the order base class), but convention has a higher priority than Ignored properties in the base class mappings, so the property still gets mapped.

    Overall this feature should make using AutoMapper with classes that leverage inheritance feel more natural.

  • 相关阅读:
    Unity Shader入门精要之 screen post-processing effect
    Unity---关于游戏小包的记录
    计算机基础补充之原码、反码、补码
    C#接口实现技巧之借助第三方
    lua中产生 1
    游戏文本本地化(一)
    xlua修复C#的委托事件的时候,需要提前做好配置
    xlua 实现协程替换Unity中的协程
    C#定义只能处理枚举类型的泛型类型
    C# : 泛型的继承关系实现的一个可以存放不同数据类型的链表
  • 原文地址:https://www.cnblogs.com/Leman/p/5774354.html
Copyright © 2011-2022 走看看