基于Web Service的客户端框架搭建四:终结篇
前言
这是这个系列的终结篇,前面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的客户端框架搭建四:终结篇的更多相关文章
- 基于Web Service的客户端框架搭建一:C#使用Http Post方式传递Json数据字符串调用Web Service
引言 前段时间一直在做一个ERP系统,随着系统功能的完善,客户端(CS模式)变得越来越臃肿.现在想将业务逻辑层以下部分和界面层分离,使用Web Service来做.由于C#中通过直接添加引用的方来调用 ...
- 基于Web Service的客户端框架搭建二:数据转换层(FCL)
引言 要使用WebService来分离客户端与服务端,必定要使用约定好两者之间的数据契约.Json数据以其完全独立于语言的优势,成为开发者的首选.C# JavaScriptSerializer为Jso ...
- 基于Web Service的客户端框架搭建三:代理层(Proxy)
前言 代理层的主要工作是调用Web Service,将在FCL层序列化好的Json数据字符串Post到Web Service,然后获得Reponse,再从响应流中读取到调用结果Json字符串,在Dis ...
- 基于JavaScript的REST客户端框架
现在REST是一个比较热门的概念,REST已经成为一个在Web上越来越常用的应用,基于REST的Web服务越来越多,包括Twitter在内的微博客都是用REST做为对外的API,先前我曾经介绍过“基于 ...
- 《基于 Web Service 的学分制教务管理系统的研究与实现》论文笔记(十一)
标题:基于 Web Service 的学分制教务管理系统的研究与实现 一.基本内容 时间:2014 来源:苏州大学 关键词:: 教务管理系统 学分制 Web Service 二.研究内容 1.教务管理 ...
- 基于Docker的TensorFlow机器学习框架搭建和实例源码解读
概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...
- .Net Core3.0 WebApi 项目框架搭建 四:JWT权限验证
.Net Core3.0 WebApi 项目框架搭建:目录 什么是JWT 根据维基百科定义,JWT(读作 [/dʒɒt/]),即JSON Web Tokens,是一种基于JSON的.用于在网络上声明某 ...
- JAVA开发Web Service几种框架介绍
郑重声明:此文为转载来的,出处已不知了,侵告删. 在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS( ...
- MyEclipse构建Web Service(Xfire框架)
以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 任务要求: 使用Xfire实现一个简单的CalculatorWebServ ...
随机推荐
- 使用dev_add_pack注冊新的以太网类型
接着上一篇文件:使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包 上一篇文章我们使用wireshare抓包.尽管在Linux下也能够使用抓包工具,可是我打算自己动手,在内核添加 ...
- [LeetCode系列] 最长回文子串问题
给定字符串S, 找到其子串中最长的回文字符串. 反转法: 反转S为S', 找到其中的最长公共子串s, 并确认子串s在S中的下标iS与在S'中的下标iS'是否满足式: length(S) = iS ...
- phpstorm 光标设置
1.是否允许光标定位在行尾之后的任意位置Allow placement of caret after end of line 这个设置是上下换行的时候,光标可以定位在任意位置,只能通过方向键移动光标, ...
- 面试总结之MISC(操作系统,网络,数学,软件开发,测试,工具,系统设计,算法)
操作系统 解释堆和栈的区别. 分配在堆的内存与分配在堆栈的内存有什么不同 分配在堆的内存要手动去释放 线程与进程的区别 多线程中栈与堆是公有的还是私有的 在多线程环境下,每个线程拥有一个栈和一个程序计 ...
- pyinstaller的使用方法 by 王大龙
---------------------------------------------------------------------------------------------------- ...
- SpringBoot入门篇--对于JSON数据的返回以及处理二
我们在进行开发的过程的难免会进行对象的返回,比如一个用户对象User,以及一个集合list,Map等等.在这篇博客中我们就是需要学习一下怎么对一个对象中某些属性的处理.需要补充的一点就是SpringB ...
- python打造漏洞补丁缺少检测
前言: 当我们进行后渗透的时候,进行提权的时候 要识别被未打补丁的漏洞.来进行提权,从而 拿到管理员权限. 思路: 1.让使用者在cmd中打systeminfo命令.将补丁号 放入一个txt. 2.与 ...
- 3_bootsrap布局容器
3.布局容器 BootStrap必须需要至少一个布局容器,才能为页面内容进行封装和方便的样式控制. 相当于一个画板. 帮助手册位置:全局CSS样式------->概览------->布局容 ...
- Go语言优势与劣势
Go语言的优势: 1.脚本化的语法:开发效率高,容易上手 2.静态类型+编译型,程序运行速度有保障:静态类型+编译型语言相对于动态类型+解释型语言的效率高 3.原生的支持并发编程:降低开发.维护成本/ ...
- C# 进程(应用程序)间通信
SendMessage用法: 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.该函数是应用程序和应用程序之间进行消息传递的主要手段之一. ...