netcore 2.2 使用 AutoMapper 实现实体之间映射
程序员文章站
2023-11-10 22:03:58
一、什么是AutoMapper? AutoMapper是一个简单的对象映射框架(OOM),将一个对象映射到另一个对象。 二、AutoMapper的好处 以前的时候我们将DTO对象转换为Model对象时,我们必须将每一个属性都手动映射 实体类 /// /// 用户表 ///
一、什么是automapper?
automapper是一个简单的对象映射框架(oom),将一个对象映射到另一个对象。
二、automapper的好处
以前的时候我们将dto对象转换为model对象时,我们必须将每一个属性都手动映射
实体类
/// <summary> /// 用户表 /// </summary> [table("tb_user")] public class tbuser { /// <summary> /// 用户id /// </summary> [key] [column("userid")] [stringlength(32)] public string userid { get; set; } /// <summary> /// 用户名 /// </summary> [column("username")] [stringlength(20)] public string username { get; set; } /// <summary> /// 邮箱 /// </summary> [column("email")] [stringlength(30)] public string email { get; set; } /// <summary> /// 添加时间 /// </summary> [column("addtime")] [required] public datetime addtime { set; get; } }
dto传输对象
/// <summary> /// 用户传输对象 /// </summary> public class userdto { /// <summary> /// 用户id /// </summary> [stringlength(32, errormessage = "{0}最多{1}个字符"), display(name = "用户id")] public string userid { get; set; } /// <summary> /// 用户名 /// </summary> [stringlength(20, errormessage = "{0}最多{1}个字符"), display(name = "用户名")] public string username { get; set; } /// <summary> /// 邮箱 /// </summary> [stringlength(30, errormessage = "{0}最多{1}个字符"), display(name = "邮箱")] public string email { get; set; } }
业务层
/// <summary> /// 业务处理 /// </summary> public class userservice : iuserservice { private readonly mydbcontext _dbcontext; /// <summary> /// 构造函数 /// </summary> /// <param name="dbcontext"></param> public userservice(mydbcontext dbcontext) { _dbcontext = dbcontext; } /// <summary> /// 添加用户 /// </summary> /// <param name="dto">实体传输对象</param> /// <returns></returns> public int add(userdto dto) { var user = new tbuser { userid = guid.newguid().tostring("n"), email = dto.email, username = dto.username, addtime = datetime.now }; _dbcontext.add(user); return _dbcontext.savechanges(); } /// <summary> /// 编辑用户信息 /// </summary> /// <param name="dto">实体传输对象</param> /// <returns></returns> public int update(userdto dto) { var user = _dbcontext.tbusers.find(dto.userid); if(user==null) throw new exception("获取用户信息失败"); user.username = dto.username; user.email = dto.email; return _dbcontext.savechanges(); } }
这样情况还可以,属性不是很多,如果属性过多(几十,几百),还需要手动赋值,简直太头疼了,还会导致大量的时间浪费在对象转换中,用automapper,只需要简单的配置就可以完成两个对象之间的属性映射,开发中省去了属性转换的时间,从而提高工作效率。
三、使用automapper
安装引用
通过程序包管理器控制台安装automapper
install-package automapper -version 9.0.0
install-package automapper.extensions.microsoft.dependencyinjection -version 7.0.0
配置映射关系
创建一个类并继承automapper的profile类
public class mappings : profile { public mappings() { createmap<userdto, tbuser>(); } }
注入服务
//注入automapper服务,mappings就是自己创建的映射类 services.addautomapper(typeof(mappings));
修改业务层代码
/// <summary> /// 业务处理 /// </summary> public class userservice : iuserservice { private readonly mydbcontext _dbcontext; /// <summary> /// 注入接口 /// </summary> private readonly imapper _mapper; /// <summary> /// 构造函数 /// </summary> /// <param name="dbcontext"></param> /// <param name="mapper"></param> public userservice(mydbcontext dbcontext,imapper mapper) { _dbcontext = dbcontext; _mapper = mapper; } /// <summary> /// 添加用户 /// </summary> /// <param name="dto">实体传输对象</param> /// <returns></returns> public int add(userdto dto) { var info = _mapper.map<userdto, tbuser>(dto); info.addtime=datetime.now; info.userid = guid.newguid().tostring("n"); //var user = new tbuser //{ // userid = guid.newguid().tostring("n"), // email = dto.email, // username = dto.username, // addtime = datetime.now //}; _dbcontext.add(info); return _dbcontext.savechanges(); } /// <summary> /// 编辑用户信息 /// </summary> /// <param name="dto">实体传输对象</param> /// <returns></returns> public int update(userdto dto) { var user = _dbcontext.tbusers.find(dto.userid); if(user==null) throw new exception("获取用户信息失败"); //user.username = dto.username; //user.email = dto.email; _mapper.map(dto, user); return _dbcontext.savechanges(); } }
运行测试
ps:一般在使用automapper转换时dto中字段名称要跟实体对象定义一样才能转换成功。
上一篇: C#通过文件路径获取文件名
下一篇: Dictionary的基本用法