当前位置: 首页 > 科技观察

.NetCore中AutoMapper高级特性的使用方法

时间:2023-03-12 19:14:35 科技观察

本文转载自微信公众号《码农阅读》,作者码农阅读。转载本文请联系码农阅读公众号。AutoMapper是一个基于约定的面向对象的映射器。它的功能通常用于将输入对象转换为不同类型的输出对象。输入和输出对象之间的属性可以相同或不同。在这篇文章中,我们将一起来研究一下AutoMapper的一些进阶玩法。安装AutoMapper在项目中使用AutoMapper,需要通过nuget引用AutoMapper和AutoMapper.Extensions.Microsoft.DependencyInjection包,可以通过VisualStudio2019的NuGet包管理器可视化界面安装或者通过NuGet输入如下命令包管理器命令行工具:安装-PackageAutoMapperInstall-PackageAutoMapper.Extensions.Microsoft.DependencyInjection来配置AutoMapperAutoMapper安装成功后,就可以将其引入到ServiceCollection容器中,如下代码所示:publicvoidConfigureServices(IServiceCollectionservices){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);services.AddAutoMapper(typeof(AuthorProfile));}使用profiles统一管理映射信息您可以使用profiles统一组织您的映射信息。创建profile需要实现AutoMapper提供的Profile类,然后在刚刚创建的Profile子类的构造函数中添加映射信息。下面的代码展示了如何创建一个继承自Proifle的AuthorProfile类及相关信息。publicclassAuthorProfile:Profile{publicAuthorProfile(){CreateMap();}}接下来看AuthorModel和AuthorDTO对象的定义:publicclassAuthorModel{publicintId{get;set;}publicstringFirstName{get;set;}publicstringLastName{get;set;}publicstringAddress{get;set;}}publicclassAuthorDTO{publicintId{get;set;}publicstringFirstName{get;set;}publicstringLastName{get;set;}publicstringAddress{get;set;}useReverseMap()值得注意的是,上面的例子是单向流,什么意思呢?比如下面是一段单向流的代码。AutoMapper.Mapper.CreateMap();有了这个Map,就可以轻松实现AuthorDTO到AuthorModel的转换,代码如下:varauthorModel=AutoMapper.Mapper.Map(author);为此,您需要将authorModel实例反转为authorDTO,然后使用以下代码片段。varauthor=AutoMapper.Mapper.Map(authorModel);不幸的是,这个方法注定会抛出异常,因为AutoMapper不知道如何实现从authorModel到authorDTO的转换。毕竟你还没有定义这种map的映射流程,那怎么解决呢?您可以定义另一个CreateMap映射。其实大可不必。简单粗暴的方法就是调用ReverseMap。实现代码如下:AutoMapper.Mapper.CreateMap().ReverseMap();使用ForMember()和MapFrom()本节继续使用前面提到的AuthorModel和AuthorDTO类。以下代码片段显示了如何将AuthorModel转换为AuthorDTO。varauthor=newAuthorModel();author.Id=1;author.FirstName="Joydip";author.LastName="Kanjilal";author.Address="Hyderabad";varauthorDTO=_mapper.Map(作者);现在假设我将AuthorModel中的Address更改为Address1,如以下代码所示:然后在AuthorProfile中更新映射信息,如下代码所示:>source.Address1));}}使用NullSubstitute什么是NullSubstitute?大意是在映射转换的过程中,将input映射为null后,做自定义处理,比如在output中改为NoData。下面的代码显示了如何实现它。AutoMapper.Mapper.CreateMap().ForMember(destination=>destination.Address,opt=>opt.NullSubstitute("Nodata"));AOP拦截映射考虑以下两个类。publicclassOrderModel{publicintId{get;set;}publicstringItemCode{get;set;}publicintNumberOfItems{get;set;}}publicclassOrderDTO{publicintId{get;set;}publicstringItemCode{get;set;}publicintNumberOfItems{get;set;}}BeforeMap()对源或目标对象执行一些计算或初始化成员操作。下面的代码展示了如何做到这一点。Mapper.Initialize(cfg=>{cfg.CreateMap().BeforeMap((src,dest)=>src.NumberOfItems=0)});执行映射后,可以在目标对象上插入AfterMap()方法,如下代码所示如何操作。publicOrderDTOMapAuthor(IMappermapper,OrderDTOorderDTO){returnmapper.Map(orderDTO,opt=>{opt.AfterMap((src,dest)=>{dest.NumberOfItems=_orderService.GetTotalItems(src);});});}使用嵌套映射AutoMapper也可以使用嵌套映射,考虑下面的域类。publicclassOrder{publicstringOrderNumber{get;set;}publicIEnumerableOrderItems{get;set;}}publicclassOrderItem{publicstringItemName{get;set;}publicdecimalItemPrice{get;set;}publicintItemQuantity{get;set;}}接下来,让我们来看看看DTO类。publicclassOrderDto{publicstringOrderNumber{get;set;}publicIEnumerableOrderItems{get;set;}}publicclassOrderItemDto{publicstringItemName{get;set;}publicdecimalItemPrice{get;set;}publicintItemQuantity{get;set;}}最后看看Mapping是怎么实现的在转换过程中使用。varorders=_repository.GetOrders();Mapper.CreateMap();Mapper.CreateMap();varmodel=Mapper.Map,IEnumerable>(订单);AutoMapper允许您以最少的配置实现对象之间的映射。同时,也可以实现自定义解析器,实现结构完全不同的对象之间的映射。自定义解析器可以生成与目标对象具有相同结构的对象。exchange以便AutoMapper可以在运行时对其进行映射。翻译链接:https://www.infoworld.com/article/3406800/more-advanced-automapper-examples-in-net-core.html