前言

  这是这个系列的终结篇,前面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的实现类。

    

 namespace ProjectmsMGT_FCL
{
public interface IDFC
{
string Object2Json(List<Object> models); List<Object> Json2Object(string json);
}
}

IDFC

    

 namespace ProjectmsMGT_FCL
{
public class DFC_User : IDFC
{
public static JavaScriptSerializer js = new JavaScriptSerializer(); #region IDFC 成员 public string Object2Json(List<object> models)
{
return js.Serialize(models);
} public List<object> Json2Object(string json)
{
List<User> objs = js.Deserialize<List<User>>(json); List<Object> list = new List<object>();
foreach (var item in objs)
{
list.Add(item);
}
return list;
} #endregion
}
}

DFC_User

    

 namespace ProjectmsMGT_FCL
{
public class DFC_Project : IDFC
{
public static JavaScriptSerializer js = new JavaScriptSerializer(); #region IDFC 成员 public string Object2Json(List<Object> models)
{
return js.Serialize(models);
} public List<Object> Json2Object(string json)
{
List<Project> objs = js.Deserialize<List<Project>>(json); List<Object> list = new List<object>();
foreach (var item in objs)
{
list.Add(item);
}
return list;
} #endregion
}
}

DFC_Project

  2、代理层Proxy

    代理层,主要工作是调用服务接口,为UI层服务,同时还要处理Web Service的权限认证以及数据传输安全(SSL)。

    主要包括Http工具类HttpHelper,类的实现可以参考【客户端框架之代理层】。ProjectProxy中就是代理函数的实现。

    

 namespace ProjectmsMGT_Proxy
{
public class ProjectmsProxy
{
private readonly string Url = "http://59.68.29.106:8087/IFT_Project.asmx";//通过配置文件获取Web Service地址
private readonly string requestParaKey = "paramaters";//服务端所有接口函数统一的参数名
private HttpHelper httpHelper; public ProjectmsProxy()
{
//初始化
Initialize();
} private void Initialize()
{
httpHelper = new HttpHelper(this.Url, this.requestParaKey);
} /// <summary>
/// 使用Get方式调用WebService,不带参数
/// </summary>
/// <param name="methodName"></param>
/// <param name="parasJsonStr"></param>
/// <param name="requestType"></param>
/// <returns></returns>
public string Excute(string methodName, string parasJsonStr, string requestType)
{
return httpHelper.CreateHttpGet(methodName, false);
} /// <summary>
/// 默认使用Post方式调用WebService,带参数
/// </summary>
/// <param name="methodName"></param>
/// <param name="parasJsonStr"></param>
/// <returns></returns>
public string Excute(string methodName, string parasJsonStr)
{
return httpHelper.CreateHttpPost(methodName, parasJsonStr, false);
} /// <summary>
/// 默认使用Post方式调用WebService,不带参数
/// </summary>
/// <param name="methodName"></param>
/// <returns></returns>
public string Excute(string methodName)
{
return httpHelper.CreateHttpPost(methodName, null, false);
}
}
}

ProjectmsProxy

  3、功能转发层Dispatcher

    主要任务是调用Proxy为UI层服务。函数分发层只有一个方法Excute,参数字符串methodName、IDFC数据格式转换接口实例对象以及List<Object>对象。主要工作是使用IDFC将参数List<Object>序列化成Json字符串,然后将methodName和Json传给Proxy中的Post方法。

    其中有个RemoteMethodName类,这个类中记录着所有需要远程调用的接口函数的名字。FunctionDispatcher就是功能转发类的Excute方法的实现,这个类在整个项目中只需要一个。

    

 namespace ProjectmsMGT_Dispatcher
{
public class RemoteMethodName
{
public readonly static string GetProjectInfoById = "GetProjectInfoById";
public readonly static string Project = "Project";
public readonly static string Project_no = "Project_no";
}
}

RemoteMethodName

    

 namespace ProjectmsMGT_Dispatcher
{
public class FunctionDispatcher
{
private ProjectmsMGT_Proxy.ProjectmsProxy proxy = new ProjectmsMGT_Proxy.ProjectmsProxy(); public List<Object> Excute(string methodName, IDFC idfc, List<Object> paras)
{
string jsonParas = idfc.Object2Json(paras);
string jsonResult = proxy.Excute(methodName, jsonParas);//默认使用Post方式 return idfc.Json2Object(jsonResult);
} public List<Object> Excute(string methodName, IDFC idfc)
{
string jsonResult = proxy.Excute(methodName); return idfc.Json2Object(jsonResult);
}
}
}

FunctionDispatcher

  4、界面层

    界面层主要就是在界面调用的实例了,

 FunctionDispatcher dispatcher = new FunctionDispatcher();
IDFC dfc = new DFC_User(); List<Object> filterList = new List<Object>();
filterList.Add(new UserFilter
{
UserID = "",
UserName = "ceshi"
}); filterList.Add(new UserFilter
{
UserID = "",
UserName = "ceshi2"
}); List<Object> resultProjects = dispatcher.Excute(RemoteMethodName.Project, dfc, filterList); foreach (var item in resultProjects)
{
User user = item as User;
this.richTextBox1.Text += user.UserID + ":" + user.UserName + "\n";
}

总结

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

基于Web Service的客户端框架搭建四:终结篇的更多相关文章

  1. 基于Web Service的客户端框架搭建一:C#使用Http Post方式传递Json数据字符串调用Web Service

    引言 前段时间一直在做一个ERP系统,随着系统功能的完善,客户端(CS模式)变得越来越臃肿.现在想将业务逻辑层以下部分和界面层分离,使用Web Service来做.由于C#中通过直接添加引用的方来调用 ...

  2. 基于Web Service的客户端框架搭建二:数据转换层(FCL)

    引言 要使用WebService来分离客户端与服务端,必定要使用约定好两者之间的数据契约.Json数据以其完全独立于语言的优势,成为开发者的首选.C# JavaScriptSerializer为Jso ...

  3. 基于Web Service的客户端框架搭建三:代理层(Proxy)

    前言 代理层的主要工作是调用Web Service,将在FCL层序列化好的Json数据字符串Post到Web Service,然后获得Reponse,再从响应流中读取到调用结果Json字符串,在Dis ...

  4. 基于JavaScript的REST客户端框架

    现在REST是一个比较热门的概念,REST已经成为一个在Web上越来越常用的应用,基于REST的Web服务越来越多,包括Twitter在内的微博客都是用REST做为对外的API,先前我曾经介绍过“基于 ...

  5. 《基于 Web Service 的学分制教务管理系统的研究与实现》论文笔记(十一)

    标题:基于 Web Service 的学分制教务管理系统的研究与实现 一.基本内容 时间:2014 来源:苏州大学 关键词:: 教务管理系统 学分制 Web Service 二.研究内容 1.教务管理 ...

  6. 基于Docker的TensorFlow机器学习框架搭建和实例源码解读

    概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...

  7. .Net Core3.0 WebApi 项目框架搭建 四:JWT权限验证

    .Net Core3.0 WebApi 项目框架搭建:目录 什么是JWT 根据维基百科定义,JWT(读作 [/dʒɒt/]),即JSON Web Tokens,是一种基于JSON的.用于在网络上声明某 ...

  8. JAVA开发Web Service几种框架介绍

    郑重声明:此文为转载来的,出处已不知了,侵告删. 在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS( ...

  9. MyEclipse构建Web Service(Xfire框架)

    以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 任务要求: 使用Xfire实现一个简单的CalculatorWebServ ...

随机推荐

  1. php 双引号字符串里包变量的用法

    第一种 $ary['a'] 去掉单引号$ary = array('a'=>1);$b = 5; $str = "fdsfdsf$ary[a]";$str = "fd ...

  2. 洛谷3343(ZJOI2015)地震后的幻想乡

    题目:https://www.luogu.org/problemnew/show/P3343 1.那个时间与边的大小排名有关,所以需要求一下最大边的期望排名就行. 2.期望排名是这样算的:(排名为1的 ...

  3. PHP 设计模式 原型模式(Prototype)之深/浅拷贝

      看PHP 设计模式 原型模式(Prototype)时,衍生出一个扩展问题之 原型拷贝的浅拷贝和深拷贝问题(不管写Java还是写PHP还是写JS时都多多少少遇到过对象拷贝问题)   比如写前端页面时 ...

  4. 再记录一次delete出错的经历

    调试的时候进行到delete语句时出现问题,我做的操作是在函数体内用int*申请了N个内存空间,这让我十分纳闷,为什么不能delete呢? 回忆到之前delete出错也遇过一次问题 手动封装OpenC ...

  5. "废物利用"也抄袭——“完全”DIY"绘图仪"<二、下位机程序设计>

    就不说怎么组装了吧,一把辛酸泪.说程序,因为这有两把辛酸泪……一把给下位机的C代码一把为了VB.NET的图像处理……不过就上上一篇说的,它们可以正确运行了,并且今天克服了Arduino上电过程中步进电 ...

  6. Keras函数式 API

    用Keras定义网络模型有两种方式, Sequential 顺序模型 Keras 函数式 API模型 之前我们介绍了Sequential顺序模型,今天我们来接触一下 Keras 的函数式API模型. ...

  7. c#中变量的作用域

    C#中的作用域和javascript中的作用域还是有区别的.呵呵 class Person { /* *确定C#变量作用域的2个规则. 1.类的字段所处的作用域等同于该字段所属类所在的作用域; * 2 ...

  8. JMS消息模型

    消息机制: 系统之间通信的中介,作为一台单独的服务器部署,大多数使用多个系统之间协作,是系统解耦的常见解决方案. 基于CS架构 作用:多个系统之间解耦,项目可以分开开发,满足显示的高可用(也可以说是异 ...

  9. springcloud(七) feign + Hystrix 整合 、

    之前几章演示的熔断,降级 都是 RestTemplate + Ribbon 和 RestTemplate + Hystrix  ,但是在实际开发并不是这样,实际开发中都是 Feign 远程接口调用. ...

  10. DevExpress之XtraReport 学习

    XtraReport 一.基本概念: XtraReports 中的每个报表都由 XtraRepot 类的一个实例表示,或者由该类的子类来表示(这种情况更常见). 因此,每个报表都作为带区的容器使用,而 ...