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 将映射到 OnlineOrderDto 和 MailOrder 我将映射到 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();
我想将多个域对象映射到它们的响应 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 我将映射到 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();