【问题标题】:Automapper abstract classAutomapper 抽象类
【发布时间】:2014-09-30 12:25:03
【问题描述】:

我有基类

 public abstract class DtoBase //NOTICE that this class is abstract
 {
     //some DTO specific things
 }

 public class concreteA_Dto : DtoBase
 {
     //some properties from A
 }

 public class concreteB_Dto : DtoBase
 {
     //some properties from B
 }

然后我有一些课程,他们彼此不认识

 public class concreteA //NOTICE that there is NO base class
 {
     //some properties from A
 }

 public class concreteB
 {
     //some properties from B
 }

我想要以这种方式使用 Automapper:

 private DtoBase GetResourceDto(object value)
 {
    return Mapper.Map<DtoBase>(value);
 }  

到目前为止,我的映射如下所示:

CreateMap<concreteA, DtoBase>()
    .Include<concreteA, concreteA_Dto>();

CreateMap<concreteA, concreteA_Dto>();

但是当我用一些具体的实例调用 GetResourceDto 方法时,我会得到 ​​p>

自动映射器异常:

Mapping types:
concreteA-> DtoBase
#NAMESPACE.concreteA -> #NAMESPACE.DtoBase

Destination path:
DtoBase

内部异常

无法创建抽象类的实例。

请注意,#NAMESPACE 是我的类的命名空间

如何执行适当的映射以避免此异常?

这背后的想法是concreteA和concreteB可以随时间动态增长,并且可能有concreteC、concreteD等。 我不介意为更具体的类添加映射

【问题讨论】:

  • 您无法映射到抽象类,AutoMapper 会创建您要映射到的类的新实例,并且错误表明您无法实例化抽象类。使您的基类具体化,它会起作用,抽象类是不合适的,因为您确实想创建它的实例。
  • 实际上我不想创建 DtoBase 的实例,我期望 GetResourceDto 的返回值是具体 A_Dto 的实例。
  • 当像这样使用自动映射器时,类层次结构必须匹配。如果您在“具体”层次结构中创建一个基类,则一切正常。
  • 这很可悲。因为有时可以代替我的具体B 来获取 List 的示例实例,并且我想将其转换为适当的 DTO 并提供其他信息。

标签: c# automapper dto


【解决方案1】:

除非您不使用代理类进行映射,否则您可能经常遇到类似的映射问题。

为您想要映射的每个类创建代理类。

您可以从here获得更多帮助

【讨论】:

  • 谢谢,我猜从架构的角度来看,应该有代理类,应该有 Ben 和 Andrew 指出的基类。我将重构我的解决方案并添加这部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多