自制AutoMapper实现DTO到持久层Entity的转换

news/2023/6/5 21:48:21

项目中经常涉及到页面DTO更新,保存到数据库的操作,这就必然牵扯到DTO和持久层对象的转换,常见的第三方库有:

java:dozer

.net: AutoMapper

看到AutoMapper已经许久没更新了,而且项目中没必要用这么大的东西,于是自己实现了一个简易DTO到Entity的转换器。

实现的功能

自定义的AutoMapper主要实现了如下几点功能:

1.DTO字段忽略转换

[AutoMapping(Ignore=true)]
public DateTime CreateTime { get; set; }

2.DTO字段和Entity的强制映射

[AutoMapping(EntityColumn="Sex")]
public string XingBie { get; set; }

3.默认DTO和Entity字段相同的,自动转换

 

核心代码:

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using System.Linq;namespace ElegantWM.AutoMapper
{public class AutoMapper<T1,T2> where T1:new() where T2:new(){/// <summary>/// DTO 转换为 Entity/// </summary>/// <typeparam name="T1">DTO</typeparam>/// <typeparam name="T2">Entity</typeparam>/// <param name="t1">Dto</param>/// <param name="t2">Entity</param>/// <returns></returns>public static T2 Convert(T1 t1, T2 t2){var dtoProperList = t1.GetType().GetProperties().Where(p => p.PropertyType.IsPublic == true).ToList();var entityProperList = t2.GetType().GetProperties().Where(p => p.PropertyType.IsPublic == true).ToList();foreach (System.Reflection.PropertyInfo pi in dtoProperList){string realName=pi.Name;//首先判断列是否ignore?,是否含有Columnobject[] cusAttrs = pi.GetCustomAttributes(typeof(AutoMappingAttribute), true);if (cusAttrs.Length > 0){AutoMappingAttribute attr = cusAttrs[0] as AutoMappingAttribute;if (attr.Ignore)continue;if (!string.IsNullOrEmpty(attr.EntityColumn))realName = attr.EntityColumn;}var entityPi = entityProperList.Single(p => p.Name == realName);if (entityPi == null)continue;object value = pi.GetValue(t1, null);if (value == null)continue;entityPi.SetValue(t2, value, null);                }return t2;}}
}
案例

持久层Entity的定义如下:

public class Entity:IEntity{public Guid Id { get; set; }public string CreateUser { get; set; }public DateTime CreateTime { get; set; }public string ModifyUser { get; set; }public DateTime? ModifyTime { get; set; }[Timestamp]public Byte[] RowVersion { get; set; }}   public class WMS_User : Entity{public WMS_User() { }public string UserName { get; set; }public string NickName { get; set; }public string UserPwd { get; set; }public string Sex { get; set; }public string Phone { get; set; }public string Email { get; set; }public string QQ { get; set; }public string Address { get; set; }public string Remark { get; set; }public bool Disable { get; set; }public virtual ICollection<WMS_OrgUser> UserOrgIds { get; set; }}

页面DTO定义如下:

public class UserDto{public UserDto() { }public Guid Id { get; set; }public string UserName { get; set; }public string NickName { get; set; }       public string UserPwd { get; set; }//强制字段映射[AutoMapping(EntityColumn="Sex")]public string XingBie { get; set; }public string Phone { get; set; }public string Email { get; set; }public string QQ { get; set; }public string Address { get; set; }public string Remark { get; set; }public bool Disable { get; set; }//忽略字段映射[AutoMapping(Ignore=true)]public DateTime CreateTime { get; set; }}    

使用AutoMapper,做转换:

     [Action][Description("更新用户")][HttpPut]public JsonResult Update(UserDto user){WMS_User userEntity = WMFactory.WMSUser.GetById(user.Id.ToString());
//*******看这里哦********userEntity = AutoMapper<UserDto, WMS_User>.Convert(user, userEntity);if (WMFactory.WMSUser.Update(userEntity))return Json(ResultMsg.Success("用户信息更新成功!"));elsereturn Json(ResultMsg.Failure("用户信息更新失败,请您重试!"));}
写在后面

自己实现,相对来说,自由度高了很多,你可以自己扩展方法,实现客制化的DTO转Entity,让AutoMapper更加适合自己的项目。

转载于:https://www.cnblogs.com/qidian10/p/3173907.html


https://dhexx.cn/news/show-18436.html

相关文章

Nginx安装及使用

Nginx安装及使用一、Nginx的安装网址二、windows下安装1、启动方式一2、启动方式二3、运行成功画面4、配置监听5、关闭nginx的两种方式三、Linux下安装四、后端负载均衡策略和反向代理实战1、编辑conf/nginx.conf2、代码3、测试一、Nginx的安装网址 安装网址 二、windows下安装…

SpringBoot整合RabbitMQ消息中间件及多种设计模式

SpringBoot整合RabbitMQ消息中间件及多种设计模式1、介绍与安装下载1.1、不同MQ特点1.2、下载1.3、打开网址2、使用可视化配置2.1、创建交换机2.2、创建队列2.3、来宾用户详情2.4、创建来宾用户2.5、用户与虚拟主机进行绑定2.6、创建虚拟主机3、五种常用的模式3.1、导入依赖3.2…

LCHub:ChatGPT4和低代码来临,程序员面临下岗?

一个网友吐槽道: “ 建站出来了,你们说程序员会失业。 低代码出来了,你们说程序员会失业。 Copilot出来了,你们说程序员会失业。 Chatgpt出来了,你们说程序员会失业 虽然这只是网友的吐槽,但却引起了小编的好奇。为何程序员那么容易被新技术取代?今天小编打算跟大家…

Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决...

昨晚在编译源码&#xff0c;make一段时间之后报错如下&#xff1a; # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc0x40362d33, pid12195, tid2835454784 # # JRE version: 6.0_45-b06 # Java VM: Java HotSpot(TM) Server VM …

3.3FactoryMethod——工厂方法

意图&#xff1a; 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。 其实在抽象工厂模式中&#xff0c;经过改进后的模式就是工厂方法模式&#xff0c;所以不多说了&#xff0c;上UML图。 通过工厂方法模式的类图…

学习ASP.NET MVC(五)——我的第一个ASP.NET MVC CURD页面

在上一篇文章中我们已经创建了实体类&#xff0c;在这一篇文章中&#xff0c;我将创建一个新的控制器类——BookController&#xff0c;使用BookController对Books表中的数据进行CURD操作的方法&#xff0c;并使用视图模板在浏览器中显示所查询到的书籍数据信息。 一、添加控制…

SpringCloud学习之路

SpringCloud学习之路1、使用IDEA搭建Eureka服务中心Server端启动1.1、创建和配置注册中心Eureka1.2、使用Eureka案例1.3、负载均衡器Ribbon1.4、负载均衡器Feign1.5、Feign核心源码解读和服务调用方式ribbon和Feign选择2、降级熔断Hystrix实战2.1、SpringCloud整合断路器的使用…

存储引擎-存储结构之二:页

说理论&#xff0c;总是枯燥的&#xff0c;先来段搞笑视频&#xff0c;清清脑 模特兒走秀摔倒集錦&#xff1a;http://947kan.com/video/player-53088-0-0.html 原文地址&#xff1a; http://www.sqlskills.com/BLOGS/PAUL/post/Inside-the-Storage-Engine-Anatomy-of-a-page.a…

Spark RDD中的宽依赖和窄依赖

Spark中RDD的高效与DAG图有着莫大的关系&#xff0c; 在DAG调度中需要对计算过程划分Stage&#xff0c; 而划分的依据就是就是RDD之间的依赖关系。 针对不同的转换函数&#xff0c;RDD之间的依赖关系分为窄依赖&#xff08;narrow dependency&#xff09; 和宽依赖&#xf…

学习java虚拟机

学习java虚拟机1、类加载的五个过程&#xff1a;加载、验证、准备、解析、初始化2、类的加载器的分类2.1、双亲委派机制3、类的加载器的分类4、Java虚拟机栈5、Java本地方法栈6、Java虚拟机栈7、Java堆8、Java方法区9、Java常量池10、Java对象创建步骤11、Java对象的内存结果12…