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年+从业经验。因为专业,所以出色。"
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  • 相关阅读:
    Linux编译工具:gcc入门
    Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程
    Socket编程实践(2) Socket API 与 简单例程
    Socket编程实践(1) 基本概念
    数据结构图文解析之:二分查找及与其相关的几个问题解析
    数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现
    [CG编程] 基本光照模型的实现与拓展以及常见光照模型解析
    郑重声明!本博客内容皆为原创且首发于博客园
    【原创】面试官:谈谈你对mysql联合索引的认识?
    【原创】为什么Mongodb索引用B树,而Mysql用B+树?
  • 原文地址:https://www.cnblogs.com/datacool/p/Dto2Entity.html
Copyright © 2011-2022 走看看