【问题标题】:What are the advantages of using automapper?使用自动映射器有什么好处?
【发布时间】:2011-04-29 02:44:49
【问题描述】:

我必须在 C# 项目中使用的域类和发送到 Flash 客户端的类之间进行一些对象到对象的映射。

我的第一选择是 Automapper。但是我遇到了一些问题(嵌套属性,没有定义无参数构造函数)。事实证明,用 Automapper 映射一个非常复杂的类型并不是那么容易。

为什么不实现如下方法?

  ClassA GetClassAByClassB(ClassB pObj)

   {  
     ClassA objA = new ClassA();  
     objA.Prop1 = pObj.Prop1;  
     objA.NestedType.Prop2 = pObj.Prop2;  
     //....Some more.....  
     return objA;  
   }  

它与使用 Automapper 完成映射具有完全相同的灵活性。您仍然必须提供将源对象中的哪个属性复制到目标对象中的哪个属性中。您只需使用 = 而不是 lambda 表达式即可。

但是,如果您更改域类中的某些内容,则无论如何都必须更改此“映射”部分。那么,与文字映射相比,使用 Automapper 的主要优势是什么?

【问题讨论】:

    标签: mapping automapper object-object-mapping


    【解决方案1】:

    AutoMapper 声称的一个好处是按约定映射。这是"AutoMapper Introduction and Samples"的引述

    AutoMapper 的魅力就在于此。当您的课程对齐时 按照惯例,您的映射配置可以是 简单

    这是有代价的。重命名或更改目标或源属性名称将破坏映射并引入运行时错误。

    如果不使用按惯例映射,AutoMapper 将失去优势。在这种情况下,我宁愿写一个像这样的工厂函数。

    public static ClassA MapToClassA(this ClassB b)
    {
        return new ClassA()
        {
            propA = b.propA;
            propB = b.propB;
            propC = b.propC;
        }
    }
    

    然后你会像这样构造目标对象

    var classA = classB.MapToClassA();
    

    而不是

    var classA = Mapper.Map<ClassB, ClassA>(classB)
    

    就我个人而言,我更喜欢工厂函数,因为它的明确性、可读性和调试友好性。祝你好运,在第二种情况下,ClassB 是如何映射到 ClassA 的,是否加载了映射配置文件,或者为什么在调用 Map&lt;&gt;() 函数时出现异常,或者为什么某些属性被分配了错误的值。

    【讨论】:

      【解决方案2】:

      因为使用 AutoMapper,您不必实现这些方法 ;-)

      你的方法需要写很多

      classA.propA = classB.propA;
      classA.propB = classB.propB;
      classA.propC = classB.propC;
      classA.propD = classB.propD;
      classA.propE = classB.propE;
      

      AutoMapper 使用约定来计算它自己。更重要的是,您不必担心pObj == null(在这种情况下,您的代码将抛出NulLReferenceException)。

      您还可以在地图中定义转换(即字符串到日期时间)。

      Mapper.CreateMap<User, UserModel>().ForMember(d => d.LastLogin, c => c.MapFrom<DateTime?>(u => u.Credential.LastLogin));
      

      AutoMapper 也支持嵌套属性。

      在此处阅读更多信息:AutoMapper Introduction and Samples

      【讨论】:

      • 不具有相同名称的属性怎么办?和嵌套属性?我想我应该改变约定,但有时一侧的属性是“PositionX”,而另一侧只是“X”。 (只是一个例子 - 属性 anmes 可能非常不可预测)。所以我不应该在我的情况下使用 Automapper 吗?
      • @Katalonis - 然后使用 lambda 以类型安全的方式配置映射器。添加了代码示例和链接。
      • 当然,另一方面是,如果您看到的 dest.MyProp, opt =&gt; opt.Ignore()dest.MyProp, opt =&gt; opt.MapFrom(src =&gt; Transformation(src.MyProp)) 比通过自动映射获得的更多,那就没那么好了。或者,就像 ank2k11 points out 一样,当 map-by-magic-string-convention 遇到问题时要小心。 Xiaoguo hits nail on its head:“当你的类按照惯例对齐时,你的映射配置可以很简单”。否则,您实际上正在实现这些方法,只需使用 AutoMapper。
      【解决方案3】:

      有时使用映射器,很难追踪错误。例如,如果我们在数据类中拼错了 Employee 而在视图模型类中拼错了 Emplyee,那么像小映射器这样的映射器不会抛出任何异常,除非我们明确地将映射器设置为严格映射,并且在此期间代码编译和运行完美,但我们是无法追踪错误。这种情况很少发生在手动映射中,因此手动映射对象比自动映射有一些优势。

      【讨论】:

      • 我正在尝试调试为什么 automapper 没有应用转换。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2015-12-13
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      相关资源
      最近更新 更多