demo地址:ABP.WindowsService
该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇。

AutoMapper简介

AutoMapper是一个简单的小型的对象映射库,是为了解决一个繁杂的问题 - 将一个对象映射到另一个对象的到处乱飞的胶水代码。这类胶水代码非常沉闷,让人怀疑自己的工作的价值性。AutoMapper就是你摆脱此类代码的福音。
官网地址:https://automapper.org/
GitHub地址:https://github.com/AutoMapper/AutoMapper

AutoMapper的简单使用

这里拿官网的例子做一个简单说明,主要是为了引出在Abp中是如何使用的,来进行对比。使用AutoMapper将遇到的最经典的两个场景。

  1. 最多遇到的场景,应该是接口返回的DTO和数据库Entity,出于敏感信息保护或者减少接口返回数据等等的原因,DTO返回的属性或者字段有所删减,也就是说需要映射的属性或者字段属性名称一致。
  2. DTO和Entity名称不一致,甚至类型不同,相互转换时甚至需要对数据有处理。

下面的例子就是字段属性基本一致。

public class Order
{public string OrderName { get;set; }public string PhoneNumber { get;set; }
}
public class OrderDto
{public string OrderName { get;set; }
}
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());
var mapper = config.CreateMapper();
OrderDto dto = mapper.Map<OrderDto>(order);

或者

var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());
var mapper = new Mapper(config);
OrderDto dto = mapper.Map<OrderDto>(order);

Abp.AutoMapper的简单使用

Abp.AutoMapper的官网文档:https://aspnetboilerplate.com/Pages/Documents/Object-To-Object-Mapping
Abp.AutoMapper的Nuget地址:https://www.nuget.org/packages/Abp.AutoMapper

添加nuget包

Install-Package Abp.AutoMapper

添加AbpAutoMapperModule模块

[DependsOn(typeof(AbpAutoMapperModule))]
public class MyJobCoreModule : AbpModule
{
}

指定映射关系

自动映射

你可以通过属性AutoMap, AutoMapFrom, AutoMapTo指定映射关系
改造上面的之前的例子

[AutoMapFrom(typeof(Order))]
public class OrderDto
{public string OrderName { get;set; }
}

或者

[AutoMapTo(typeof(OrderDto))]
public class Order
{public string OrderName { get;set; }public string PhoneNumber { get;set; }
}

但是属性的使用场景比较窄,稍微复杂一点的场景就无法满足,比如,指定忽略一些字段,或者字段名称不同需要显示指定。

自定义映射

[DependsOn(typeof(AbpAutoMapperModule))]
public class MyJobCoreModule : AbpModule
{public override void PreInitialize(){Configuration.Modules.AbpAutoMapper().Configurators.Add(config =>{config.CreateMap<Order, OrderDto>();});}
}

忽略字段

config.CreateMap<Order, OrderDto>().ForMember(u => u.PhoneNumber, options => options.Ignore());

字段名不一致

OrderDto增加手机号字段Tel,映射Order字段PhoneNumber

    public class OrderDto{public string OrderName { get; set; }public string Tel { get; set; }}
config.CreateMap<Order, OrderDto>().ForMember(u => u.Tel, options => options.MapFrom(input => input.PhoneNumber));

需要对字段进行处理后返回

比如,隐藏11位手机号的中间4位

private static string HideTel(string input)
{if (string.IsNullOrEmpty(input)){return string.Empty;}var outReplace = Regex.Replace(input, "(\\d{3})\\d{4}(\\d{4})", "$1****$2");return outReplace;
}
config.CreateMap<Order, OrderDto>().ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.PhoneNumber)));

拼接映射

又比如OrderDto新增邮寄地址和收货地址

namespace Demo.MyJob.Entity.Dto
{public class OrderDto{public string OrderName { get; set; }public string Tel { get; set; }public string PostalAddress { get; set; }public string DeliveryAddress { get; set; }}
}

Order的相关表OrderAddress类型定义

namespace Demo.MyJob.Entity
{public class OrderAddress{public string OrderId { get; set; }public string PostalAddress { get; set; }public string DeliveryAddress { get; set; }}
}

这时就需要OrderAddress和Order的数据相结合映射OrderDto,怎么实现呢?借助元组Tuple。

config.CreateMap<(Order, OrderAddress), OrderDto>().ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.Item1.PhoneNumber))).ForMember(u => u.OrderName, options => options.MapFrom(input => input.Item1.OrderName)).ForMember(u => u.PostalAddress, options => options.MapFrom(input => input.Item2.PostalAddress)).ForMember(u => u.DeliveryAddress, options => options.MapFrom(input => input.Item2.DeliveryAddress));

精简配置

需要自定义的映射关系过多时,会使得PreInitialize变大,不便于管理和查看。

public override void PreInitialize()
{Configuration.Modules.AbpAutoMapper().Configurators.Add(config =>{config.CreateMap<(Order, OrderAddress), OrderDto>().ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.Item1.PhoneNumber))).ForMember(u => u.OrderName, options => options.MapFrom(input => input.Item1.OrderName)).ForMember(u => u.PostalAddress, options => options.MapFrom(input => input.Item2.PostalAddress)).ForMember(u => u.DeliveryAddress, options => options.MapFrom(input => input.Item2.DeliveryAddress));});
}

如何精简?新增类型MyMapperProfile,继承AutoMapper.Profile

using System.Text.RegularExpressions;
using AutoMapper;
using Demo.MyJob.Entity;
using Demo.MyJob.Entity.Dto;namespace Demo.MyJob.MapperProfiles
{class MyMapperProfile : Profile{private static string HideTel(string input){if (string.IsNullOrEmpty(input)){return string.Empty;}var outReplace = Regex.Replace(input, "(\\d{3})\\d{4}(\\d{4})", "$1****$2");return outReplace;}public MyMapperProfile(){CreateMap<Order, OrderDto>().ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.PhoneNumber)));CreateMap<(Order, OrderAddress), OrderDto>().ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.Item1.PhoneNumber))).ForMember(u => u.OrderName, options => options.MapFrom(input => input.Item1.OrderName)).ForMember(u => u.PostalAddress, options => options.MapFrom(input => input.Item2.PostalAddress)).ForMember(u => u.DeliveryAddress, options => options.MapFrom(input => input.Item2.DeliveryAddress));}}
}

修改PreInitialize

[DependsOn(typeof(AbpAutoMapperModule))]
public class MyJobCoreModule : AbpModule
{public override void PreInitialize(){Configuration.Modules.AbpAutoMapper().Configurators.Add(config =>{config.AddMaps(typeof(MyJobCoreModule));});}
}

Abp.AutoMapper版本低于4.8.0的可以修改为

config.AddProfiles(typeof(MyJobCoreModule));

以上就是如何在Abp框架下灵活使用AutoMapper的全部内容,谢谢阅读。

在ABP中灵活使用AutoMapper相关推荐

  1. ABP中的Filter(下)

    接着上面的一个部分来叙述,这一篇我们来重点看ABP中的AbpUowActionFilter.AbpExceptionFilter.AbpResultFilter这三个部分也是按照之前的思路来一个个介绍 ...

  2. 【转】ABP源码分析四十七:ABP中的异常处理

    ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationExce ...

  3. 【转】ABP源码分析三十五:ABP中动态WebAPI原理解析

    动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...

  4. 【转】ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数必然已完成了执行 ...

  5. abp+dapper+mysql_ABP公共结构 – 时间与时区设置 - ABP 中文文档

    2.6 ABP公共结构 – 时间与时区设置 2.6.1 简介 虽然有些应用的需求是单时区,然而另一些是需要对不同的时区进行处理的.为了满足这样的需求以及对时间的处理.ABP提供了处理时间操作的通用基础 ...

  6. ABP源码分析四十七:ABP中的异常处理

    ABP源码分析四十七:ABP中的异常处理 参考文章: (1)ABP源码分析四十七:ABP中的异常处理 (2)https://www.cnblogs.com/1zhk/p/5538983.html (3 ...

  7. 记载abp中Dbcontext的疑问

    q:abp中httpcontext如何在一次请求中保证获取的是相同的实例. 大牛的原话: LifestylePerWebRequest does not works good with async. ...

  8. ABP中使用Redis Cache(1)

    本文将讲解如何在ABP中使用Redis Cache以及使用过程中遇到的各种问题.下面就直接讲解使用步骤,Redis环境的搭建请直接网上搜索. 使用步骤: 一.ABP环境搭建 到http://www.a ...

  9. ABP架构学习系列二:ABP中配置的注册和初始化

    一.手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp.Abp.Web.Abp.Web.Mvc.Abp.Web.Api 使用nuget添加Newtonsoft.Json.Castle.Cor ...

最新文章

  1. Excel+bat批量更改文件名
  2. glnxa64 matlab 什么版本_Matlab R2018a无法重新加载 /usr/local/MATLAB/R2018a/bin/glnxa64/libmwxcp_dwarf.so...
  3. 车辆颜色识别学习笔记
  4. linux php pdo server,linux服务器用PHP的PDO链接myql方法(php pdo)
  5. JAVA内存模型与线程安全
  6. URL请求到Action的映射规则
  7. 新版本NexT 调动态背景、调canvas_nest的解决方案
  8. 倍周期分岔 matlab,由倍周期分岔走向混沌-Read.DOC
  9. 如何改变Delphi的快捷键 - DELPHI
  10. java 信号处理模块_GitHub - Astoros-Fung/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...
  11. 如何在doc下运行java程序及打包成.jar格式的Java程序
  12. 超级推荐!!值得收藏的黑客系列书:《黑客攻防实战xx》系列图书简介,一共4本
  13. 安装之后如何激活冰点还原软件?
  14. 常见计算机硬件故障维修方法,电脑硬件有哪些常见问题 电脑硬件常见问题维修技巧【详解】...
  15. 如何在 Linux 上最好地设置命令别名
  16. 手机上面正常显示网页大小
  17. JS跟APP交互——H5调用原生APP的方法
  18. 您有一份《七夕安全须知》待查收
  19. ArcGIS中实现空间内插
  20. [小记] 微信小程序 - 人脸识别前端(一)初体验

热门文章

  1. 《构建之法》第一次作业 第一篇博客
  2. Opencv_100问_第四章 (16-20)
  3. 新浪微博 ID与MID互转 (62进制)
  4. python更新织梦网站_织梦DEDECMS自动更新首页的办法
  5. Java求两个数的最大公约数及最小公倍数、求多个数的最大公约数及最小公倍数
  6. SQL Server :Stored procedures存储过程初级篇
  7. 述职报告的写作五点要求,很多人都忽视了
  8. Java 编写大鱼吃小鱼游戏 窗体程序 完整源码
  9. 《深度学习》学习笔记一——线性代数
  10. Bill Gates Centimillionaire and one poor man.