码迷,mamicode.com
首页 > 其他好文 > 详细

面对对象之差异化的网络数据交互方式

时间:2014-11-14 15:41:33      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:blog   ar   数据   on   2014   log   as   new   数据库   

面对对象之差异化的网络数据交互方式


传统开发C/S还是B/S应用都会经过这几个步骤
1.编写定义服务端实体类,一般还需要映射到数据库
2.编写定义消息类
3.编写定义客户端实体类,一般服务端实体类会比客户端多一点,当然也可以和服务端公用.
4.编写应用逻辑
5.赋值返回数据到消息类,然后进行返回


这里来讲解一种简单的模式进行优化和解放这些繁琐的体力活.


如果共用实体类,那么依然要4个步骤.
基于消息类和逻辑的对应方法,一般有多少个请求定义,就有多少个消息类.
一般开发人员会对一些消息进行精简和合并,类似的结果共用,这样能减少一些定义过程.


面对消息定义,我们巴不得能把这个对象丢过去,这样后期修改就无所谓增加一个字段,或者减少一个字段.
可能会影响数个接口进行修改.
字段多,会增加流量,以及冗余数据.
字段少,基本上一个接口对应一个消息.


用一个简单的示例程序来进行讲解:

定义一个实体类

   /// <summary>
    /// 实现属性通知接口
    /// </summary>
    public class GameInfo : INotifyPropertyChanged
    {
        private string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        private int _Count;

        public int Count
        {
            get { return _Count; }
            set { _Count = value; }
        }

        private bool _isOpen;

        public bool IsOpen
        {
            get { return _isOpen; }
            set { _isOpen = value; }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName, object value)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

传统模式修改分别对应修改1个属性,2个属性和3和属性

        //传统模式

        [WebMethod]
        public ChangeNameResult ChangeNameAI(string name)
        {
            GameInfo.Name = name;
            return new ChangeNameResult() {NewName = GameInfo.Name};
        }

        [WebMethod]
        public ChangeNameAndCountResult ChangeNameAndCountI(string name)
        {
            GameInfo.Name = name;
            GameInfo.Count++;
            return new ChangeNameAndCountResult() { NewName = GameInfo.Name, Count = GameInfo.Count };
        }

        [WebMethod]
        public ChangeALLResult ChangeALL(string name)
        {
            GameInfo.Name = name;
            GameInfo.Count++;
            GameInfo.IsOpen = !GameInfo.IsOpen
            return new ChangeALLResult() { NewName = GameInfo.Name, Count = GameInfo.Count,IsOpen = GameInfo.IsOpen};
        }

对应的返回数据类型:


    /// <summary>
    /// 返回对象
    /// </summary>
    [Serializable]
    public class ResultObject
    {
        /// <summary>
        /// 如果有错误ErrorCode不为0
        /// </summary>
        public int ErrorCode { get; set; }

    }



    /// <summary>
    /// ChangeName 返回值
    /// </summary>
    [Serializable]
    public class ChangeNameResult : ResultObject
    {
        /// <summary>
        /// 新名称
        /// </summary>
        public string NewName { get; set; }
    }


    [Serializable]
    public class ChangeNameAndCountResult : ChangeNameResult
    {
        public int Count { get; set; }
    }

    [Serializable]
    public class ChangeALLResult : ChangeNameResult
    {
        public  bool IsOpen { get; set; }
    }

如果偷懒,可以直接用最多的这个,但是看着会很不舒服,也不太好.


下面是差异修改模式示例:

 /// <summary>
    /// 通用返回
    /// </summary>
    [Serializable]
    public class ValueChangeResultObject : ResultObject
    {
        /// <summary>
        /// 统一返回值
        /// </summary>
        public string ResultStr { get; set; }
    }

    /// <summary>
    /// 返回对象
    /// </summary>
    [Serializable]
    public class ResultObject
    {
        /// <summary>
        /// 如果有错误ErrorCode不为0
        /// </summary>
        public int ErrorCode { get; set; }

    }

示例逻辑方法:

       //差异数据返回模式
        private string ChangeValues = "";
        [WebMethod]
        public string ChangeNameAndCountI(string name)
        {
            GameInfo.Name = name;
            GameInfo.Count++;
            return GetResult();
        }

        [WebMethod]
        public ValueChangeResultObject ChangeNameAII(string name)
        {
            GameInfo.Name = name;
            return GetResult();
        }

        [WebMethod]
        public ChangeALLResult ChangeALL(string name)
        {
            GameInfo.Name = name;
            GameInfo.Count++;
            GameInfo.IsOpen = !GameInfo.IsOpen
            return GetResult();
        }



        /// <summary>
        /// 获取通用返回方法
        /// </summary>
        /// <returns></returns>
        public ValueChangeResultObject GetResult()
        {
            return new ValueChangeResultObject() { ResultStr = ChangeValues };
        }


        [WebMethod]
        public string InitChangeObject()
        {
            GameInfo.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(GameInfo_PropertyChanged);
        }


        private void GameInfo_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            //这边自定一个比较简单的返回结构
            //字段1:值1;
            //字段1:值1;字段2:值2;
            ChangeValues += e.PropertyName + ":" + typeof (GameInfo).GetProperty(e.PropertyName).GetValue() + ";"
                
        }


面对对象之差异化的网络数据交互方式

标签:blog   ar   数据   on   2014   log   as   new   数据库   

原文地址:http://blog.csdn.net/icesun963/article/details/41118577

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!