2015-09-11 128 views
2

我想多域对象映射到其响应DTO的升级后Automapper继承映射不​​起作用。 V3.3.1.0 - > V4.0.4.0

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能够辨别和使用规定选择适当的源和目标的定义通过型式。即一个网上订单将被映射到一个OnlineOrderDto邮购我将被映射到一个MailOrderDto。事实并非如此,因为我得到了“无法创建抽象类的实例”的错误。我几乎可以肯定我之前使用过类似的模式,但是我碰到了墙壁,我将不胜感激。

更新:在升级到最新版本的Automapper V4.0.4.0后,这似乎只是一个问题。

+0

类似[问题](http://stackoverflow.com/questions/32141447/updated-automapper-from-3-to-4-broke-inheritance-mapping/32142076)。 – vendettamit

回答

2

是的这是一个已知的issue,需要更改代码。你的配置更改为 -

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(); 
+0

尽管我没有使用这个确切的解决方案,但它指出了我的Google-Fu无法解决的问题。我已经拥有了由Autofac管理的Automapper配置启动程序,因此,在注册Autofac IStartable配置后,我不需要改变工作方式,而只需调用Mapper.Configuration.Seal()。谢谢vendettamit。 – GavKilbride

+0

这是我上次使用它以来的新增功能。感谢分享我不知道密封方法。 – vendettamit

+0

用最近的错误修复更新了答案。 – vendettamit