你怎么看?您如何在域和表示模型之间进行映射?
3 回答
使用 AutoMapper 也有一些缺点,其中一些缺点通常适用于按约定编程(与显式编写代码相反)。
假设您有两个 C# 类 -
namespace MyDtoNamespace {
public class MyClass {
public int Id { get; set; }
}}
namespace MyBusinessLayerNamespace {
public class MyClass {
public int Id { get; set; }
}}
AutoMapper 将在这两个类之间很好地映射,几乎不需要显式配置。
但后来,假设开发人员考虑将这些 Id 属性之一重命名为不同的东西,例如
namespace MyBusinessLayerNamespace {
public class MyClass {
public int MyNewIdentifierVariableName { get; set; }
}}
我在 Visual Studio 中仔细搜索引用,并考虑重命名对这些引用的影响——但因为 MyDtoNamespace.MyClass.Id 没有明确引用 MyBusinessLayerNamespace.MyClass.Id,所以我从来没有看到它。
当 Visual Studio 或其他工具自动为我在解决方案中重命名所有出现的变量时,AutoMapper 映射会中断。
我只能在运行时找到它,没有编译时问题。理想情况下,我有单元测试来验证我的映射是否如我所愿,但即便如此,重构期间运行时错误的可能性是更喜欢编写显式映射代码的一个很好的理由。
我当然不是在争论完全避免使用 AutoMapper,只是注意到按惯例编程的一个主要问题。
引用另一个 Automapper 问题的部分答案:
如果您有一个类型的对象,并且您想使用第一种类型的属性填充另一种类型的对象的属性,您有两种选择:
- 手动编写代码来做这样的映射。
- 使用会自动为您处理此问题的工具。
AutoMapper 是 2 的一个例子。
LINQ to Objects 是 1 的一个例子——它恰好比编写 vanila 对象到对象映射代码要少一些痛苦。
从优缺点来看:
与 LINQ 相比,Automapper 应显着减少您必须编写的代码量,因为它使用约定来确定默认映射。使用 LINQ,必须定义这些默认映射。
使用 LINQ 有必要在两个方向上定义映射 - Automapper 应该能够在使用约定时自动解决这个问题。
与所有第三方 dll 一样,使用 Automapper 会引入另一个依赖项,并且需要一个小的学习曲线(请注意,对于以前没有使用过 LINQ 的开发人员也会有一个学习曲线)。
请注意,Automapper 可以与 LINQ(和 LINQ2SQL)结合使用——另一篇 Automapper 文章解释了一些细节。