面对对象之差异化的网络数据交互方式
传统开发C/S还是B/S应用都会经过这几个步骤
1.编写定义服务端实体类,一般还需要映射到数据库
2.编写定义消息类
3.编写定义客户端实体类,一般服务端实体类会比客户端多一点,当然也可以和服务端公用.
4.编写应用逻辑
5.赋值返回数据到消息类,然后进行返回
如果共用实体类,那么依然要4个步骤.
基于消息类和逻辑的对应方法,一般有多少个请求定义,就有多少个消息类.
一般开发人员会对一些消息进行精简和合并,类似的结果共用,这样能减少一些定义过程.
面对消息定义,我们巴不得能把这个对象丢过去,这样后期修改就无所谓增加一个字段,或者减少一个字段.
可能会影响数个接口进行修改.
字段多,会增加流量,以及冗余数据.
字段少,基本上一个接口对应一个消息.
传统模式修改分别对应修改1个属性,2个属性和3和属性
对应的返回数据类型:
如果偷懒,可以直接用最多的这个,但是看着会很不舒服,也不太好.
示例逻辑方法:
传统开发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() + ";"
}