您现在的位置是:亿华云 > 数据库
如何在 .NetCore 中使用 AutoMapper 高级功能
亿华云2025-10-09 13:44:32【数据库】9人已围观
简介本文转载自微信公众号「码农读书」,作者码农读书。转载本文请联系码农读书公众号。AutoMapper 是一个基于约定的面向对象的映射器,它的功能常用于将一个 input 对象 转成一个不同类型的 out
本文转载自微信公众号「码农读书」,中使作者码农读书。中使转载本文请联系码农读书公众号。中使
AutoMapper 是中使一个基于约定的面向对象的映射器,它的中使功能常用于将一个 input 对象 转成一个不同类型的 output 对象,input 和 output 对象之间的中使属性可能相同也可能不相同,这一篇我们来一起研究一下 AutoMapper 的中使一些高级玩法。
安装 AutoMapper
要想在项目中使用 AutoMapper ,中使需要通过 nuget 引用 AutoMapper 和 AutoMapper.Extensions.Microsoft.DependencyInjection 包,中使可以通过 Visual Studio 2019 的中使 NuGet package manager 可视化界面安装 或者 通过 NuGet package manager 命令行工具输入以下命令:
Install-Package AutoMapper Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection配置 AutoMapper
一旦 AutoMapper 成功安装之后,接下来就可以将它引入到 ServiceCollection 容器中,中使如下代码所示:
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddAutoMapper(typeof(AuthorProfile)); }使用 profiles 统一管理 mapping 信息
可以使用 profiles 来统一组织你的中使 mapping 信息,要创建 profile,中使需要实现 AutoMapper 提供的中使 Profile 类,然后在你刚才创建的中使 Profile 子类的构造函数中添加映射信息,下面的代码展示了如何创建一个从 Proifle 继承的 AuthorProfile 类以及相关信息。
public class AuthorProfile : Profile { public AuthorProfile() { CreateMap<AuthorModel, AuthorDTO>(); } }接下来再看 AuthorModel 和 AuthorDTO 两个对象的定义:
public class AuthorModel { public int Id { get; set; } public string FirstName { get;set; } public string LastName { get; set; } public string Address { get; set; } } public class AuthorDTO { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; }使用 ReverseMap()
值得注意的是,b2b供应网上面的示例是一种 单向流动,这是什么意思呢?举个例子吧,下面是 单向流动 的一段代码。
AutoMapper.Mapper.CreateMap<AuthorDTO, AuthorModel>();有了这个 Map,接下来就可以轻松实现 AuthorDTO 到 AuthorModel 的转换,代码如下:
var authorModel = AutoMapper.Mapper.Map<AuthorModel>(author);假设因为某种原因,你需要将 authorModel 实例反转成 authorDTO,这时你用了如下的代码段。
var author = AutoMapper.Mapper.Map(authorModel);很遗憾,这种方式注定会抛出异常,这是因为 AutoMapper 并不知道如何实现 authorModel 到 authorDTO 的转换,毕竟你没有定义此种 map 的映射流向,那怎么解决呢?可以再定义一个 CreateMap 映射哈,其实没必要,简单粗暴的做法就是调用 ReverseMap 即可,实现代码如下:
AutoMapper.Mapper.CreateMap<AuthorDTO, AuthorModel>().ReverseMap();使用 ForMember() 和 MapFrom()
这一节我们继续使用之前说到的 AuthorModel 和 AuthorDTO 类,下面的代码片段展示了如何将 AuthorModel 转成 AuthorDTO 。
var author = new AuthorModel(); author.Id = 1; author.FirstName = "Joydip"; author.LastName = "Kanjilal"; author.Address = "Hyderabad"; var authorDTO = _mapper.Map<AuthorDTO>(author);现在假设我将 AuthorModel 中的 Address 改成 Address1,网站模板如下代码所示:
public class AuthorModel { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Address1 { get; set; } }然后在 AuthorProfile 中更新一下 mapping 信息,如下代码所示:
public class AuthorProfile : Profile { public AuthorProfile() { CreateMap<AuthorModel, AuthorDTO>().ForMember(destination => destination.Address, map => map.MapFrom(source => source.Address1)); } }使用 NullSubstitute
何为 NullSubstitute 呢?大意就是在映射转换的过程中,将input 为null 的属性映射之后做自定义处理,比如在 ouput 中改成 No Data,下面的代码展示了如何去实现。
AutoMapper.Mapper.CreateMap<AuthorModel, AuthorDTO>().ForMember(destination => destination.Address, opt => opt.NullSubstitute("No data"));mapping 的 AOP 拦截
考虑下面的两个类。
public class OrderModel { public int Id { get; set; } public string ItemCode { get; set; } public int NumberOfItems { get; set; } } public class OrderDTO { public int Id { get; set; } public string ItemCode { get; set; } public int NumberOfItems { get; set; } }可以使用 BeforeMap() 在 源对象 或者 目标对象 上执行一些计算或者初始化成员操作,下面的代码展示了如何去实现。
Mapper.Initialize(cfg => { cfg.CreateMap().BeforeMap((src, dest) => src.NumberOfItems = 0) });当 mapping 执行完之后,可以在 目标对象 上 安插 AfterMap() 方法,下面的代码展示了如何去实现。
public OrderDTO MapAuthor(IMapper mapper, OrderDTO orderDTO) { return mapper.Map<OrderModel, OrderDTO>(orderDTO, opt => { opt.AfterMap((src, dest) => { dest.NumberOfItems = _orderService.GetTotalItems(src); }); }); }使用嵌套映射
AutoMapper 同样也可以使用嵌套映射,考虑下面的 domain 类。
public class Order { public string OrderNumber { get; set; } public IEnumerable<OrderItem> OrderItems { get; set; } } public class OrderItem { public string ItemName { get; set; } public decimal ItemPrice { get; set; } public int ItemQuantity { get; set; } }接下来再看一下 DTO 类。
public class OrderDto { public string OrderNumber { get; set; } public IEnumerable<OrderItemDto> OrderItems { get; set; } } public class OrderItemDto { public string ItemName { get; set; } public decimal ItemPrice { get; set; } public int ItemQuantity { get; set; } }最后看看如何在转换的过程中使用 mapping 的。
var orders = _repository.GetOrders(); Mapper.CreateMap<Order, OrderDto>(); Mapper.CreateMap<OrderItem, OrderItemDto>(); var model = Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(orders);AutoMapper 让你用最小化的配置实现了对象之间的映射,同时也可以实现自定义的解析器来实现具有完全不同结构对象之间的映射,自定义解析器可以生成与目标对象具有相同结构的香港云服务器exchange,以便AutoMapper在运行时可以据其实现映射。
译文链接:https://www.infoworld.com/article/3406800/more-advanced-automapper-examples-in-net-core.html
很赞哦!(93)
上一篇: 二、如何选择合适的域名
下一篇: 四、长串数字域名
相关文章
- 比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
- 一篇搞懂TCP、HTTP、Socket、Socket连接池
- 一篇文章带你了解JavaScript for循环
- 2021年还要不要学编程?看完这20年的薪水曲线再决定
- tk域名是什么域名?新手对tk域名有什么看法?
- 如何掌握在Python中监控文件系统的技术
- 卸载 PyCharm!这才是 Python 小白的最理想的 IDE
- 程序员必备的10大GitHub仓库
- 投资各类域名就像到处打游击战,结果处处失败。因为这样,对任何一个中国域名市场的走势和价格都没有准确的把握,所以最好缩小范围,准确把握战场态势,埋伏。
- 值得推荐的七大流行Web开发技术栈
站长推荐
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
如何成为一名合格的Java程序员?
鸿蒙HarmonyOS三方件开发指南-GifImage
鸿蒙HarmonyOS三方件开发指南-SwipeLayout侧滑删除
4、域名传输时,取决于域名原始用户的邮箱是否有效,以及他是否将密码发送到此邮箱。
Vue 3.0 进阶之应用创建的过程
用OkHttp实现WebSocket长连接
详解Java中重要的错误处理机制异常