自动apper继承映射在升级后不工作.V3.3.1.0→V4.0.4.0

本文关键字:V3 V4 工作 映射 继承 apper 自动 | 更新日期: 2023-09-27 18:12:09

我想将多个域对象映射到它们的响应DTO

public abstract class Order
{
    public int Id { get; set; }
}
public class OnlineOrder : Order
{
    public string Referrer { get; set; }
}
public class MailOrder : Order
{
    public string Address { get; set; }
}

DTO

public abstract class OrderDto
{
    public int Id { get; set; }
}
public class OnlineOrderDto : OrderDto
{
    public string Referrer { get; set; }
}
public class MailOrderDto : OrderDto
{
    public string Address { get; set; }
}

映射定义

Mapper.CreateMap<Order, OrderDto>()
    .Include<OnlineOrder, OnlineOrderDto>()
    .Include<MailOrder, MailOrderDto>();
Mapper.CreateMap<OnlineOrder, OrderDto>();
Mapper.CreateMap<MailOrder, OrderDto>();

对象映射

var orders = new List<Order>()
    {
        new OnlineOrder { Referrer = "Google", Id = 123 }, 
        new MailOrder() { Address = "1600 Amphitheatre Parkway", Id = 124}
    };
var mapped = Mapper.Map<List<OrderDto>>(orders);

我希望Automapper能够识别传入的类型,并使用指定的定义来选择适当的源和目标。例如,OnlineOrder将被映射到OnlineOrderDto,而MailOrder I将被映射到MailOrderDto。这不是情况,因为我得到一个"抽象类的实例不能被创建"错误。我几乎可以肯定我以前使用过类似的模式,但我遇到了瓶颈,如果有任何帮助,我将不胜感激。

更新:似乎只有升级到最新版本的Automapper V4.0.4.0后才会出现这个问题

自动apper继承映射在升级后不工作.V3.3.1.0→V4.0.4.0

是的,这是一个已知问题,需要更改代码。将初始化更改为-

Mapper.Initialize(cfg =>
        {
            cfg .CreateMap<Order, OrderDto>()
              .Include<OnlineOrder, OnlineOrderDto>()
              .Include<MailOrder, MailOrderDto>();
              cfg.CreateMap<OnlineOrder, OrderDto>();
              cfg.CreateMap<MailOrder, OrderDto>();
        });

更新版本:修复4.1.0里程碑的错误

或者,您可以做的是密封映射。

Mapper.Configuration.Seal();