在写API过程中,因为业务关系经常要把数据传递给前端,而业务的数据类型来源于Model层中的属性,有的时候我们不想把所有属性都暴露出来,只需要部分属性而或者需要一些处理过的数据,介于Model层上我们可以新建一个Dto层,利用自动映射框架批量化处理数据节省搬砖的劳动力,也方便日后的更新和维护:
一、首先安装自动映射框架(每次安装框架时都得注意版本):
二、向系统的IOC容器注入AutoMapper的服务依赖:
在StartUp文件的ConfigureServices方法里面:
//扫描profile文件(配置文件) services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
AtuoMapper服务依赖注册机制:AddAutoMapper将会自动扫描程序集里所有包含映射关系的ProFile文件,然后通过调用AppDomain.CurrentDomain.GetAssemblies(),AtuoMapper会把所有的ProFile文件加载到目前的AppDomain中。
系统的映射就是通过ProFile进行管理的;
三、创建Dto文件
原来的Medel:
四、创建ProFile文件
public class TouristRouteProfile : Profile { public TouristRouteProfile() { CreateMap<TouristRoute, TouristRouteDto>() .ForMember( //ForMember函数做字段的投影, dest => dest.Price, //目标对象 opt => opt.MapFrom(src => src.OriginalPrice * (decimal)(src.DiscountPresent ?? 1)) //原始数据做改变 ) .ForMember( dest => dest.TravelDays, opt => opt.MapFrom(src => src.TravelDays.ToString()) ) .ForMember( dest => dest.DepartureCity, opt => opt.MapFrom(src => src.DepartureCity.ToString()) ) .ForMember( dest => dest.TripType, opt => opt.MapFrom(src => src.TripType.ToString()) );
}
}
五、在Controller中运用:
①给控制器注入服务依赖:
②运用:
对比:
手动映射和自动映射:
AutoMapper自动映射强大之处还有一个地方,在更新资源时,需要很多步逻辑很乱的操作:
①把需要更新的数据取出来映射成Dto;
②更新这个Dto的数据;
③把更新后的Dto再映射回Model层;
而用AutoMapper只需要一部的操作:
注意:在使用TouristRouteForUpdateDto与TouristRoute映射之前一定要先把映射的数据模型添加到ProFile文件中:
CreateMap<TouristRouteForUpdateDto, TouristRoute>();
这个是HttpPut请求更新资源的controller,更新时会把数据全局更新,如果没有传入的数据进行更新,系统则会默认为null,而部分更新需用用到HttpPatch,至于怎么用,后面的文章中会提到;