面向对象的方式进行数据交换网络之间的差异
传统的发展C/S依然是B/S应用程序将通过几个步骤
1.编写服务器端实体类的定义,通常还需要映射到数据库
2.写一个自定义的消息类
3.写一个定义client实体类,一般服务类比终端实体client多,然也能够和服务端公用.
4.编写应用逻辑
5.赋值返回数据到消息类,然后进行返回
假设共用实体类,那么依旧要4个步骤.
基于消息类和逻辑的相应方法,一般有多少个请求定义,就有多少个消息类.
一般开发者会对一些消息进行精简和合并,类似的结果共用,这样能降低一些定义过程.
面对消息定义,我们巴不得能把这个对象丢过去,这样后期改动就无所谓添加一个字段,或者降低一个字段.
可能会影响数个接口进行改动.
字段多,会添加流量,以及冗余数据.
字段少,基本上一个接口相应一个消息.
传统模式改动分别相应改动1个属性,2个属性和3和属性
相应的返回数据类型:
假设偷懒,能够直接用最多的这个,可是看着会非常不舒服,也不太好.
演示样例逻辑方法:
传统的发展C/S依然是B/S应用程序将通过几个步骤
1.编写服务器端实体类的定义,通常还需要映射到数据库
2.写一个自定义的消息类
3.写一个定义client实体类,一般服务类比终端实体client多,然也能够和服务端公用.
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() + ";" }
版权声明:本文博客原创文章。博客,未经同意,不得转载。