项目
版本

AutoMapper 入门指南

AutoMapper 是什么?

AutoMapper 是一个对象-对象映射器。对象-对象映射通过将一种类型的输入对象转换为不同类型的输出对象来工作。使 AutoMapper 引人注目的是,它提供了一些有趣的约定,以减轻弄清楚如何将类型 A 映射到类型 B 的繁琐工作。只要类型 B 遵循 AutoMapper 建立的约定,几乎不需要配置就可以映射两种类型。

为什么使用 AutoMapper?

映射代码很乏味。测试映射代码更令人厌烦。AutoMapper 提供了类型配置的简单方式,以及映射测试的简易性。真正的问题可能是 “为什么使用对象-对象映射?” 映射可以在应用程序中的许多地方发生,但主要发生在层之间的边界,例如在 UI/Domain 层或 Service/Domain 层之间。层的关注点常常与另一层的关注点相冲突,因此对象-对象映射导致了分隔的模型,其中每一层的关注点只能影响该层中的类型。

如何使用 AutoMapper?

首先,你需要一个源类型和目标类型来工作。目标类型的设计可以受到它所处层的影响,但只要成员名称与源类型成员匹配,AutoMapper 就能最好地工作。“FirstName” 这样的源成员名会自动映射到名为 “FirstName” 的目标成员。AutoMapper 也支持 扁平化

当从源映射到目标时,AutoMapper 会忽略空引用异常。这是设计使然。如果你不喜欢这种方法,可以根据需要结合使用 AutoMapper 的方法和 自定义值解析器

一旦有了你的类型,就可以使用 MapperConfigurationCreateMap 为这两种类型创建一个映射。通常每个 AppDomain 只需要一个 MapperConfiguration 实例,并且应该在启动时实例化。更多初始化设置的例子可以在 Setup 中看到。

var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());

左侧的类型是源类型,右侧的类型是目标类型。要执行映射,调用 Map 方法的某个重载:

var mapper = config.CreateMapper();
// 或
var mapper = new Mapper(config);
OrderDto dto = mapper.Map<OrderDto>(order);

大多数应用程序可以使用依赖注入来注入创建的 IMapper 实例。

AutoMapper 还为这些方法提供了非泛型版本,用于可能在编译时不知道类型的场景。

我在哪里配置 AutoMapper?

配置应该只在一个 AppDomain 中发生一次。这意味着放置配置代码的最佳位置是在应用程序启动时,比如对于 ASP.NET 应用来说是在 Global.asax 文件中。通常,配置引导类在其自己的类中,这个引导类从启动方法被调用。引导类应构造一个 MapperConfiguration 对象来配置类型映射 。

对于 ASP.NET Core依赖注入 文章展示了如何在你的应用程序中配置 AutoMapper

如何测试我的映射?

为了测试你的映射,你需要创建一个测试,做两件事:

  • 调用你的引导类来创建所有映射
  • 调用 MapperConfiguration.AssertConfigurationIsValid

这里有一个例子:

var config = AutoMapperConfiguration.Configure();

config.AssertConfigurationIsValid();
在本文档中