AutoMapper主要处理对象与对象之间的映射,减少程序员自己编写代码的工作量,提高开发效率。
应用场景:
假如你想对原始数据,进行部分字段展示,那么你需要创建一个对应的DTO类,进行手动映射,这样太麻烦。所以可以采用自动映射。
一、AutoMapper的安装使用
1.nuget下载如同所示的工具包。AutoMapper.Extensions.Microsoft.DependencyInjection
2.注入服务依赖。
//注入自动映射服务 //AppDomain.CurrentDomain.GetAssemblies()获取项目程序集
//扫秒profile文件
//需要nuget AutoMapper 具体名称看依赖包
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
AddAutoMapper
会自动扫描项目中的profiles文件夹,通过profile进行自动映射。
3.在项目中创建profiles文件夹。
4.创建profile类。
public class TouristRouteProfile:Profile
{
//映射配置就是在构造函数完成的
//AutoMapper 在注入完成后 会自动扫秒Profile 然后通过构造函数完成映射
public TouristRouteProfile()
{
//CreateMap:
//第一个参数是模型对象 第二个参数是映射的目标对象
//俩个对象中相同的字段会自动映射
ForMember:
///第一个参数是 目标对象dto
///第二个参数是原始数据模型 进行修改和 赋值给对应的字段
///将数据库里的数据通过Molde映射到Dto中 然后展示在界面
CreateMap<TouristRoute, TouristeRouteDto>().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.TripType,
opt => opt.MapFrom(src => src.TripType.ToString())
).ForMember(
dest => dest.DepartureCity,
opt => opt.MapFrom(src => src.DepartureCity.ToString())
);
///上面修改的数据 等同于
/// Price=touristeRouteFromRepo.Originalprice*(decimal)(touristeRouteFromRepo.DiscountPresent ?? 1),//变量定义中含有两个问号,意思是取所赋值??左边的,如果左边为null,取所赋值??右边的。 DiscountPresent是折扣
/// travelDays = touristeRouteFromRepo.travelDays.ToString(),
/// TripType = touristeRouteFromRepo.TripType.ToString(),
/// DepartureCity = touristeRouteFromRepo.DepartureCity.ToString()
/// 省去了相同字段手动赋值的麻烦
/// 相同字段和不想修改的数据 可以自动映射
//将前端接收到的创建数据通过Dto映射到Molde中
CreateMap<TouristRouteForCreationDto, TouristRoute>().ForMember(
dest => dest.Id,
opt => opt.MapFrom(src => Guid.NewGuid())
);
CreateMap<TouristRouteForUpdateDto, TouristRoute>();
CreateMap<TouristRoute, TouristRouteForUpdateDto>();
}
}
注意该类,一定要继承Profile
类其中CreateMap
方法主要就是做关系映射,ForMember
是自定义映射的数据格式和类容。MapFrom
就是将元数据中的类容做一下转换,给到dest对应的Dto对象。
5.使用。
映射关系做完后,我们可以在控制器中使用了。
//数据仓库接口
private ITouristRouteRepository _touristRouteRepository;
private readonly IMapper _mapper;
//依赖注入 构造函数注入
//注入的时候已经实现了ITouristRouteRepository 因为参数类型已经注册到了ioc容器,所以他所对面的实现类会直接返回实例
public TouristRoutesController(ITouristRouteRepository touristRouteRepository,IMapper mapper) {
_touristRouteRepository = touristRouteRepository;
_mapper = mapper;
}
方法() { ///Map泛型是映射的结果 参数是原始数据
var touristRouteDto = _mapper.Map<TouristeRouteDto>(touristeRouteFromRepo);
return Ok(touristRouteDto);}
这样就完成了一个简单的映射关系。