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

netcore 2.2 封装 AutoMapper

程序员文章站 2023-11-15 16:44:52
在上篇中我们通过创建一个类并继承autoMapper的Profile类 public class Mappings : Profile { public Mappings() { CreateMap(); } } 这样做有一种弊端,就是当传输对象很多的时候,还需要手 ......

在上篇中我们通过创建一个类并继承automapper的profile类

    public class mappings : profile
    {
        public mappings()
        {
            createmap<userdto, tbuser>();
        }
    }

这样做有一种弊端,就是当传输对象很多的时候,还需要手动一个个的配置映射关系,维护起来相对来说也比较麻烦。

封装automapper

创建automapperextension扩展类

    /// <summary>
    /// automapper扩展类
    /// </summary>
    public static class automapperextension
    {
        /// <summary>
        /// 将源对象映射到目标对象
        /// </summary>
        /// <typeparam name="t">实体类型</typeparam>
        /// <param name="obj">源对象</param>
        /// <returns>转化之后的实体</returns>

        public static t mapto<t>(this object obj)
        {
            if (obj == null) throw new exception("异常");
            var config = new mapperconfiguration(ctx => ctx.createmap(obj.gettype(), typeof(t)));
            var mapper = config.createmapper();
            return mapper.map<t>(obj);
        }

        /// <summary>
        /// 将源对象映射到目标对象
        /// </summary>
        /// <typeparam name="t">实体类型</typeparam>
        /// <param name="dto">源对象</param>
        /// <param name="entity">目标对象</param>
        /// <returns>转化之后的实体</returns>
        public static t map<t>(object dto, t entity)
        {
            var config = new mapperconfiguration(ctx => ctx.createmap(dto.gettype(), typeof(t)));
            var mapper = config.createmapper();
            var newmodel = mapper.map(dto, entity);
            return newmodel;
        }
    }

修改业务层

去掉构造函数中imapper注入

去掉启动类startup.cs中 services.addautomapper(typeof(mappings)) 方法

        /// <summary>
        /// 添加用户
        /// </summary>
        /// <param name="dto">实体传输对象</param>
        /// <returns></returns>
        public int add(userdto dto)
        {
            //var info = _mapper.map<userdto, tbuser>(dto);
            var info = dto.mapto<tbuser>();
            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;
            automapperextension.map(dto, user);
            return _dbcontext.savechanges();
        }

运行测试

跟封装前一样的效果

netcore 2.2 封装 AutoMapper