c端产品操作手册(CAutoMaper介绍)
c端产品操作手册(CAutoMaper介绍)//DTO与Model之间可以这样转化,因为的对象的属性都为string类型 DTO.userName = Model.userName; DTO.age = Model.age ; DTO.job = Model.job ;使用AutoMapper转化://首先需要先为DTO与Model之间定义一个映射关系 Mapper.CreateMap<Model DTO>(); //从数据库取出数据 Model modelData= GetdtoDataFromDB(); //转化为交互的数据 DTO dtoData = Mapper.Map<Model DTO>(modelData ); //也可以这样写: DTO dtoData = Mapper.Map<DTO>(modelData);这里的Model对象就被AutoMapper自动转化成了DTO对象,所
AutoMapper是一个能自动完成对象与对象之间转化的开源库;安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择AutoMapper.Extensions.Microsoft.DependencyInjection安装到你的项目即可。
通常DTO(Data Transfer Object数据传输对象)与Model之间的常规转化做法会使代码相当的冗长,AutoMapper作者为了减少这种工作量,写了这个开源库,使DTO与Model之间能够自动的完成转化。
基础使用方法:
public class DTO
{
public string userName {set; get;}
public string age {set; get;}
public string job {set; get;}
}
public class Model
{
public string userName {set; get;}
public string age {set; get;}
public string job {set; get;}
}
上述的DTO与Model,一般情况下,Model为直接映射数据库中的数据,与数据库的字段是一致的。DTO为交互数据,表示在网络上传输的数据,是要暴露给消费者的,为演示方便上述两者对象字段名称是一样的,实际可以不一样。那么如何把两者对象里的数据进行映射呢?
- 通常的做法为:
//DTO与Model之间可以这样转化,因为的对象的属性都为string类型
DTO.userName = Model.userName;
DTO.age = Model.age ;
DTO.job = Model.job ;
- 使用AutoMapper转化:
//首先需要先为DTO与Model之间定义一个映射关系
Mapper.CreateMap<Model DTO>();
//从数据库取出数据
Model modelData= GetdtoDataFromDB();
//转化为交互的数据
DTO dtoData = Mapper.Map<Model DTO>(modelData );
//也可以这样写:
DTO dtoData = Mapper.Map<DTO>(modelData);
这里的Model对象就被AutoMapper自动转化成了DTO对象,所以modelData中的userName、age、job的值即为GetdtoDataFromDB()方法取出来的值。
在实际的项目中使用AutoMapper对DTO与Model进行自动转化的时候遇到了一个坑点,其实也不算是坑点,只是一个我没有注意到的地方,这里做一个记录,加深自己的印象。DTO与Model的结构如下:
// DTO
public class DTO
{
public string userName {set; get;}
public string age {set; get;}
public string job {set; get;}
public AddressDTO address {set ; get;}
}
public class AddressDTO
{
public string country {set; get;}
public string province {set; get;}
}
//Model
public class Model
{
public string userName {set; get;}
public string age {set; get;}
public string job {set; get;}
public AddressModel address {set ; get;}
}
public class AddressModel
{
public string country {set; get;}
public string province {set; get;}
}
类似与这样的对应的涵盖子实体的我们在写法上面需要修订就需要再添加上子对象的映射
Mapper.CreateMap<DTO Model>()Mapper.CreateMap<AddressDTO AddressModel >();//子对象映射关系DTO dtoData = GetdtoDataFromDB();Model modelData = Mapper.Map<DTO Model>(dtoData );