自动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后才会出现这个问题
是的,这是一个已知问题,需要更改代码。将初始化更改为-
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();