• 基于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类中添加接口函数名常量,这样代码人员的工作就很轻松,需要添加的代码很少。这个框架的主要好处就是模块扩展性好,开发效率高。

  • 相关阅读:
    普元云计算-阿里云上的容器技术实践详解
    普元云计算-微服务架构实战:Swagger规范RESTful API
    普元云计算-元数据驱动的微服务架构(上)
    普元云计算-云计算平台项目团队组织架构与缘起
    普元云计算-新一代数字化企业云平台缘起
    普元云计算-为什么选择Kubernetes作为云平台的微服务治理框架
    快捷键对比
    spring mvc带参数重定向
    微信公众号菜单与应用交互session
    @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • 原文地址:https://www.cnblogs.com/caiwenz/p/3927249.html
Copyright © 2020-2023  润新知