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


    原文地址:http://www.cnblogs.com/qidian10/p/3173907.html

    项目中经常涉及到页面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?,是否含有Column
                    object[] 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("用户信息更新成功!"));
                else
                    return Json(ResultMsg.Failure("用户信息更新失败,请您重试!"));
            }
    复制代码
    写在后面

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

  • 相关阅读:
    20101029总结
    编程感悟
    编程实现>ASP.NET 3.5开发范例精讲精析>探讨SqlDataSource控件
    GET代替POST?
    php调试工具安装
    php 命令行方式使用
    多为数组转换成一维递归
    mysql优化相关
    操作目录
    递归树
  • 原文地址:https://www.cnblogs.com/fcsh820/p/3175043.html
Copyright © 2020-2023  润新知