欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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();
        }
    }

运行测试

netcore 2.2 使用 AutoMapper 实现实体之间映射 

ps:一般在使用automapper转换时dto中字段名称要跟实体对象定义一样才能转换成功。