9

我必须在 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 的主要优势是什么?

4

3 回答 3

6

AutoMapper 声称的一个好处是按惯例映射。这是来自“AutoMapper 介绍和示例”的引用

这就是 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<>()调用函数时出现异常,或者为什么某些属性被分配了错误的值。

于 2017-01-20T01:18:29.847 回答
4

因为使用 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 介绍和示例

于 2010-10-22T11:16:57.793 回答
4

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

于 2018-04-30T05:04:51.177 回答