zoukankan      html  css  js  c++  java
  • 基于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 + "
    ";
    23 }

    总结

      设计完了代理层,数据转换层,Dispatcher层之后,如果有了新的模块,我们需要做的就是设计UI层,数据层Data,对数据对象实现一个IDFC实现类,在RemoteMethodName类中添加接口函数名常量,这样代码人员的工作就很轻松,需要添加的代码很少。这个框架的主要好处就是模块扩展性好,开发效率高。

  • 相关阅读:
    linux常用命令
    mysql 开发基础系列20 事务控制和锁定语句(上)
    sql server 性能调优之 资源等待 CXPACKET
    mysql 开发基础系列19 触发器
    mysql 开发基础系列18 存储过程和函数(下)
    mysql 开发基础系列17 存储过程和函数(上)
    sql server 性能调优之 资源等待PAGEIOLATCH
    mysql 开发基础系列16 视图
    mysql 开发基础系列15 索引的设计和使用
    sql server 性能调优之 当前用户请求分析 (1)
  • 原文地址:https://www.cnblogs.com/caiwenz/p/3927249.html
Copyright © 2011-2022 走看看