基于Web Service的客户端框架搭建四:终结篇
前言
这是这个系列的终结篇,前面3个博客介绍了一下内容:
框架结构
框架是基于C#的,在VS2010中搭建出来的,解决方案搭建完毕之后的框架结构如下图:
如上图,框架主要分数据层Data,数据转换成FCL,代理层Proxy,功能分发层Dispatcher以及界面层UI。
1、数据转换层FCL
数据格式转换层,位于在Proxy服务代理层和UI界面层之间。在UI层使用的都是明确的实例对象(比如User对象、Project对象),通过FCL层的 转换变成Json数据格式的字符串,然后代理层得到字符串,作为服务接口的参数。代理层通过服务接口方法得到Json数据之后,同样通过DFC层转换 成相应的实力对象,然后绑定到UI上。
IDFC是数据转换接口,DFC_Project和DFC_User类是接口IDFC的实现类。
1 namespace ProjectmsMGT_FCL 2 { 3 public interface IDFC 4 { 5 string Object2Json(List<Object> models); 6 7 List<Object> Json2Object(string json); 8 } 9 }
1 namespace ProjectmsMGT_FCL 2 { 3 public class DFC_User : IDFC 4 { 5 public static JavaScriptSerializer js = new JavaScriptSerializer(); 6 7 #region IDFC 成员 8 9 public string Object2Json(List<object> models) 10 { 11 return js.Serialize(models); 12 } 13 14 public List<object> Json2Object(string json) 15 { 16 List<User> objs = js.Deserialize<List<User>>(json); 17 18 List<Object> list = new List<object>(); 19 foreach (var item in objs) 20 { 21 list.Add(item); 22 } 23 return list; 24 } 25 26 #endregion 27 } 28 }
1 namespace ProjectmsMGT_FCL 2 { 3 public class DFC_Project : IDFC 4 { 5 public static JavaScriptSerializer js = new JavaScriptSerializer(); 6 7 #region IDFC 成员 8 9 public string Object2Json(List<Object> models) 10 { 11 return js.Serialize(models); 12 } 13 14 public List<Object> Json2Object(string json) 15 { 16 List<Project> objs = js.Deserialize<List<Project>>(json); 17 18 List<Object> list = new List<object>(); 19 foreach (var item in objs) 20 { 21 list.Add(item); 22 } 23 return list; 24 } 25 26 #endregion 27 } 28 }
2、代理层Proxy
代理层,主要工作是调用服务接口,为UI层服务,同时还要处理Web Service的权限认证以及数据传输安全(SSL)。
主要包括Http工具类HttpHelper,类的实现可以参考【客户端框架之代理层】。ProjectProxy中就是代理函数的实现。
1 namespace ProjectmsMGT_Proxy 2 { 3 public class ProjectmsProxy 4 { 5 private readonly string Url = "http://59.68.29.106:8087/IFT_Project.asmx";//通过配置文件获取Web Service地址 6 private readonly string requestParaKey = "paramaters";//服务端所有接口函数统一的参数名 7 private HttpHelper httpHelper; 8 9 public ProjectmsProxy() 10 { 11 //初始化 12 Initialize(); 13 } 14 15 private void Initialize() 16 { 17 httpHelper = new HttpHelper(this.Url, this.requestParaKey); 18 } 19 20 /// <summary> 21 /// 使用Get方式调用WebService,不带参数 22 /// </summary> 23 /// <param name="methodName"></param> 24 /// <param name="parasJsonStr"></param> 25 /// <param name="requestType"></param> 26 /// <returns></returns> 27 public string Excute(string methodName, string parasJsonStr, string requestType) 28 { 29 return httpHelper.CreateHttpGet(methodName, false); 30 } 31 32 /// <summary> 33 /// 默认使用Post方式调用WebService,带参数 34 /// </summary> 35 /// <param name="methodName"></param> 36 /// <param name="parasJsonStr"></param> 37 /// <returns></returns> 38 public string Excute(string methodName, string parasJsonStr) 39 { 40 return httpHelper.CreateHttpPost(methodName, parasJsonStr, false); 41 } 42 43 /// <summary> 44 /// 默认使用Post方式调用WebService,不带参数 45 /// </summary> 46 /// <param name="methodName"></param> 47 /// <returns></returns> 48 public string Excute(string methodName) 49 { 50 return httpHelper.CreateHttpPost(methodName, null, false); 51 } 52 } 53 }
3、功能转发层Dispatcher
主要任务是调用Proxy为UI层服务。函数分发层只有一个方法Excute,参数字符串methodName、IDFC数据格式转换接口实例对象以及List<Object>对象。主要工作是使用IDFC将参数List<Object>序列化成Json字符串,然后将methodName和Json传给Proxy中的Post方法。
其中有个RemoteMethodName类,这个类中记录着所有需要远程调用的接口函数的名字。FunctionDispatcher就是功能转发类的Excute方法的实现,这个类在整个项目中只需要一个。
1 namespace ProjectmsMGT_Dispatcher 2 { 3 public class RemoteMethodName 4 { 5 public readonly static string GetProjectInfoById = "GetProjectInfoById"; 6 public readonly static string Project = "Project"; 7 public readonly static string Project_no = "Project_no"; 8 } 9 }
1 namespace ProjectmsMGT_Dispatcher 2 { 3 public class FunctionDispatcher 4 { 5 private ProjectmsMGT_Proxy.ProjectmsProxy proxy = new ProjectmsMGT_Proxy.ProjectmsProxy(); 6 7 public List<Object> Excute(string methodName, IDFC idfc, List<Object> paras) 8 { 9 string jsonParas = idfc.Object2Json(paras); 10 string jsonResult = proxy.Excute(methodName, jsonParas);//默认使用Post方式 11 12 return idfc.Json2Object(jsonResult); 13 } 14 15 public List<Object> Excute(string methodName, IDFC idfc) 16 { 17 string jsonResult = proxy.Excute(methodName); 18 19 return idfc.Json2Object(jsonResult); 20 } 21 } 22 }
4、界面层
界面层主要就是在界面调用的实例了,
1 FunctionDispatcher dispatcher = new FunctionDispatcher(); 2 IDFC dfc = new DFC_User(); 3 4 List<Object> filterList = new List<Object>(); 5 filterList.Add(new UserFilter 6 { 7 UserID = "0206001", 8 UserName = "ceshi" 9 }); 10 11 filterList.Add(new UserFilter 12 { 13 UserID = "0206002", 14 UserName = "ceshi2" 15 }); 16 17 List<Object> resultProjects = dispatcher.Excute(RemoteMethodName.Project, dfc, filterList); 18 19 foreach (var item in resultProjects) 20 { 21 User user = item as User; 22 this.richTextBox1.Text += user.UserID + ":" + user.UserName + "\n"; 23 }
总结
设计完了代理层,数据转换层,Dispatcher层之后,如果有了新的模块,我们需要做的就是设计UI层,数据层Data,对数据对象实现一个IDFC实现类,在RemoteMethodName类中添加接口函数名常量,这样代码人员的工作就很轻松,需要添加的代码很少。这个框架的主要好处就是模块扩展性好,开发效率高。