在两个不同的类型对象之间传输数据,通常我们会用DTOs(数据传输对象),AutoMapper就是将一个对象自动转换为另一个对象的技术
背景
一些orm框架,在用到Entity的时候有一些开源代码用到了automapper(如:nopcommence),将数据对象转成DTO。比如在ORM中,与数据库交互用的Model模型是具有很多属性变量方法神马的。而当我们与其它系统(或系统中的其它结构)进行数据交互时,出于耦合性考虑或者安全性考虑或者性能考虑(总之就是各种考虑),我们不希望直接将这个Model模型传递给它们,这时我们会创建一个贫血模型来保存数据并传递。什么是贫血模型?贫血模型(DTO,Data Transfer Object)就是说只包含属性什么的,只能保存必须的数据,没有其它任何的多余的方法数据什么的,专门用于数据传递用的类型对象。在这个创建的过程中,如果我们手动来进行,就会看到这样的代码:
A a=new A();
a.X1=b.X1;
a.X2=b.X2;
...
...
...
return a; 太麻烦
此时,AutoMapper可以发挥的作用就是根据A的模型和B的模型中的定义,自动将A模型映射为一个全新的B模型。(不用一个属性一个属性的赋值)
好处:
1、 db或者模型 增加字段时,只需在DTO内部增加映射,赋值代码无需修改
2、隔离,前端收集各参数,不用管后端定义的模型。前后端用AutoMapper来做转换。
使用
Nuget引用:AutoMapper 版本不一样,里面的很多方法有些不一样
AutoMapper是基于约定的,因此在使用映射之前,我们需要先进行映射规则的配置。
我们要做的只是将要映射的两个类型告诉AutoMapper(调用Mapper类的Static方法CreateMap并传入要映射的类型):
Mapper.Initialize(cfg => { cfg.CreateMap<StudentEntity, StudentOutput>(); });
也可以将实体类 放在配置文件MapperProfile中
Mapper.Initialize(cfg => { cfg.AddProfile<MapperProfile>(); cfg.AddProfile<ProxyAdapterProfile>(); //可增加多个 });
注意:多次调用 Mapper.Initialize() 只有最后一次生效。所以只能用一个Mapper.Initialize。
【AutoMapper.7.0.1】
class MapperProfile : Profile { public MapperProfile() { CreateMap<StudentEntity, StudentOutput>(); var map = CreateMap<UploadResponseBase, UploadResult>(); //字段名称不一致,一次直接定义好所有字段的映射规则 map.ConvertUsing(s => new UploadResult { IsSuccess = s.success, FileUrl = s.clientUrl, ErrorMessage = s.rawFileName , datetimeStr = (s.datetime).ToString(), }); } }