Automapper 继承映射在升级后不起作用。 V3.3.1.0 -> V4.0.4.0

Automapper inheritance mapping not working after upgrade. V3.3.1.0 -> V4.0.4.0

我想将多个域对象映射到它们的响应 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 将映射到 OnlineOrderDtoMailOrder 我将映射到 MailOrderDto。情况并非如此,因为我收到 "Instances of abstract classes cannot be created" 错误。我几乎可以肯定我以前使用过类似的模式,但我遇到了困难,我们将不胜感激。

更新:看来是升级到最新版本的Automapper V4.0.4.0后才出现的问题。

是的,这是已知的 issue,需要更改代码。将您的初始化更改为 -

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

Update ver: bug fixed for 4.1.0 milestone

或者,您可以密封映射。

Mapper.Configuration.Seal();