基於Web Service的客戶端框架搭建四:終結篇


前言

  這是這個系列的終結篇,前面3個博客介紹了一下內容:

  1、使用Http Post方式調用Web Service

  2、客戶端框架之數據轉換層

  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 }
IDFC
    
 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 }
DFC_User
    
 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 }
DFC_Project

 

  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 }
ProjectmsProxy

 

  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 }
RemoteMethodName
    
 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 }
FunctionDispatcher

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM