zoukankan      html  css  js  c++  java
  • Dto2Entity,WCF+ADO.EF数据传输对象和实体对象转换

    DTO(Data transfer object):

    数据传输对象 专门用来传输的数据对象,只包含有可读写的属性,不包含任何方法;在WCF中使用时属性DataMember标记,对象自己用DataContract标记。比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段,客户端用获取数据,没有必要把整个PO(persistant object持久对象,使用EF时就是EntityObject)对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO(ViewObject表现层对象)。

         如果在使用WCF时使用DTO,那么必然会遇到dto 和 entity转换的问题,每回手写转换好累啊。尝试着写个通用的方法来实现,以前看到过这个思路,但是当时忘记摘录下来备用,那么自己动手实现了。请看详情,有更好的办法和建议请留言。

    /// <summary>
            /// Dto对象转Entity,只是复制属性,dto的属性要比entity少2个哦。
            /// </summary>
            /// <typeparam name="T">EntityObject</typeparam>
            /// <param name="dto">dto对象</param>
            /// <returns>EntityObject对应的实例</returns>
            public EntityObject ConvertToEntityObject<T>(object dto) where T : EntityObject
            {
                Type dtoEntity = dto.GetType();
                var piList = dtoEntity.GetProperties().Where(p => p.PropertyType.IsPublic == true).ToList();
                Assembly assembly = Assembly.GetAssembly(typeof(T));
                object resultObj = assembly.CreateInstance(string.Join(".",new string[]{typeof(T).Namespace,typeof(T).Name}));
                var piResultObj = resultObj.GetType().GetProperties().Where(p => p.PropertyType.IsPublic == true).ToList();
                foreach (System.Reflection.PropertyInfo pi in piList)
                {
                    var sourcePi = piResultObj.Single(p => p.Name == pi.Name);
                     if (sourcePi != null)
                     {
                         object value = pi.GetValue(dto, null);
                         sourcePi.SetValue(resultObj, value, null);
                     }                    
                }
                return resultObj as EntityObject;
            }


    使用:

       

    public bool AddUserEntity(MainAppDataAccess.DTO.SystemOperatorDto userDto)
            {
                try
                {
                    using (AuthorityDbEntities db = new AuthorityDbEntities())
                    {
                        db.SysOperator.AddObject(ConvertToEntityObject<SysOperator>(userDto) as SysOperator);
                        db.SaveChanges();
                    }
                    return true;
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex);
                    return false;
                }
            }

       

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    "作者:" 数据酷软件工作室
    "出处:" http://datacool.cnblogs.com
    "专注于CMS(综合赋码系统),MES,WCS(智能仓储设备控制系统),WMS,商超,桑拿、餐饮、客房、足浴等行业收银系统的开发,15年+从业经验。因为专业,所以出色。"
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  • 相关阅读:
    21.Merge Two Sorted Lists 、23. Merge k Sorted Lists
    34. Find First and Last Position of Element in Sorted Array
    leetcode 20. Valid Parentheses 、32. Longest Valid Parentheses 、301. Remove Invalid Parentheses
    31. Next Permutation
    17. Letter Combinations of a Phone Number
    android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
    oc 异常处理
    oc 类型判断
    oc Delegate
    oc 协议
  • 原文地址:https://www.cnblogs.com/datacool/p/Dto2Entity.html
Copyright © 2011-2022 走看看