前言
這是這個系列的終結篇,前面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類中添加接口函數名常量,這樣代碼人員的工作就很輕松,需要添加的代碼很少。這個框架的主要好處就是模塊擴展性好,開發效率高。