译者注:技术日新月异,不保证此文章有效性,请以官方更新为准.另外为了便于理解,翻译不会照搬原文而是稍作修改
翻译日期 2017年3月5日
什么是AutoMapper?
AutoMapper是一个对象到对象的转换映射工具(object-object mapper).它能把一个输入对象转换成一个不同类型的对象输出.AutoMapper更有趣的地方是它提供了一些有趣的惯例规则来帮助我们转换对象.可以这样理解:只要按照AutoMapper 建立的规则来(构造实体),就不需要进行任何多余的设置.
为什么使用AutoMapper?
手动配对 非常无聊,测试配对是否正确 更无聊.AutoMapper配置简单,测试容易,还不快用?.其实这个问题要这么问"为毛要用object-object mapper?"配对会发生在很多地方,特别是层与层之间,比如UI层和领域层,或者服务层和领域层.修改了一个层通常会导致另外一个层的冲突,所以让object-object mapper来隔离模型,让每个层都能独立做好自己的事吧.
如何使用AutoMapper?
首先,你需要一个原始类和目标类.虽然目标类的设计可以按照他所在的层来,但是如果能够保证字段名称相同AutoMapper 能更好的为你服务.比如 你有一个原始类的字段叫 "FirstName",他会自动的配对目标类中的"FirstName"字段.AutoMapper 同样支持 Flattening
AutoMapper在配对的时候会忽略空引用异常,这个是故意设计的,如果你不喜欢,你可以搭配使用Custom-value-resolvers
一旦你有了想要配对的类型,那就用 MapperConfiguration 或者 静态类 Mapper 创建一个配对.通常情况下,每个应用程序域只需要一个 MapperConfiguration 实例 并且在启动的时候被实例化,你可以使用Mapper.Initialize (更多例子请看 Static-and-Instance-API )
Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());
//或者
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());
左边是原始,右边是目标类,是用静态方法还是实例化Mapper来配对 取决于 static or instance initialization:
var mapper = config.CreateMapper();
// 或者
var mapper = new Mapper(config);
OrderDto dto = mapper.Map<OrderDto>(order);
// 或者
OrderDto dto = Mapper.Map<OrderDto>(order);
大多数应用可以使用依赖注入的方法来 注入 已经创建的 IMapper 实例
AutoMapper 针对上面的方法还有非泛型的版本,当在编译的时候还不知道类型时使用
在哪里配置AutoMapper?
如果你使用静态Mapper配对,每个程序领域只能设置一次,也就是说最好的地方就是在程序开始的地方,比如ASP.NET程序就设置在 Global.asax 文件下.通常情况下配置启动器的类需要自己单独一个类,然后在应用程序的启动方法中被调用,启动器的类可以叫 Mapper.Initialize 来配置所有的配对
怎么测试我的mappings?
为了测试你的配对,你需要做两件事
- 调用启动器类创建好所有的配对
- 调用 MapperConfiguration.AssertConfigurationIsValid
比如:
var config = AutoMapperConfiguration.Configure();
config.AssertConfigurationIsValid();