什么是AutoMapper?
AutoMapper是一个对象-对象映射器。对象-对象映射的工作原理是将一种类型的输入对象转换为不同类型的输出对象。AutoMapper的有趣之处在于,它提供了一些有趣的约定,将如何将类型A映射到类型B的繁琐工作解决掉。只要类型B遵循AutoMapper的既定约定,映射两个类型几乎不需要任何配置。
为什么要使用AutoMapper?
映射代码很无聊。测试映射代码就更无聊了。AutoMapper提供了简单的类型配置,以及简单的映射测试。真正的问题可能是“为什么要使用对象-对象映射?”映射可以发生在应用程序中的许多地方,但主要是在层与层之间的边界,例如UI/领域(Domain)层之间,或服务(Service)/领域(Domain)层之间。一层的关注点经常与另一层的关注点发生冲突,因此对象-对象映射使得模型之间隔离,每层的关注点只会影响该层中的类型。
如何使用AutoMapper?
首先,您需要同时使用源和目标类型。目标类型的设计可能会受到其所在层的影响,但是只要成员的名称与源类型的成员匹配,AutoMapper就能工作得最好。如果您有一个名为“FirstName”的源成员,它将自动映射到名称为“FirstName”的目标成员。AutoMapper还支持扁平化(Flattening)。
当将源映射到目标时,AutoMapper将忽略空引用异常。设计就是如此。如果不喜欢这种方法,可以根据需要将AutoMapper的方法与自定义值解析器(custom value resolvers)结合使用。
一旦有了类型,就可以使用 MapperConfiguration 和 CreateMap 为这两种类型创建映射。通常每个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 文件。通常,配置引导程序(bootstrapper)类在它自己的类中,并且这个引导程序类是从startup方法调用的。引导程序类应该构造一个 MapperConfiguration 对象来配置类型映射。
对于ASP.NET Core,依赖注入(Dependency Injection)文章展示了如何在应用程序中配置AutoMapper。
如何测试映射?
要测试映射,你需要创建一个做两件事的测试:
- 调用 bootstrapper 类来创建所有映射
- 调用 MapperConfiguration.AssertConfigurationIsValid
例如:
var config = AutoMapperConfiguration.Configure();
config.AssertConfigurationIsValid();