SCSF智能客户端学习笔记(一)
什么是智能客户端
要了解智能客户端,首先要认识瘦客户端技术和胖客户端技术各自的优缺点。
对于前者,典型的应用就是使用浏览器,通过输入URL远程访问服务端,并向服务端发送命令,获取服务端的资源,然后在客户端的浏览器上显示出来。由于这种技术数据库存放在服务端,客户端应用界面的也是由服务端的文件生成,因此在客户端上占用资源少,对客户端的设备要求不高,只需一个浏览器软件和可用的网络便能开始工作,另外,如果系统需要升级修改,只需要在服务端更新文件,当客户再次访问时,就可以使用新的应用系统了,因而部署和升级重点都放在了服务端,实现起来比较简单。但是,这种B/S模式依赖网络,当网络不可用时或出现性能不稳定的情况时就会导致客户端变成“死界面”——既不能将数据发送回服务端进行保存,又不能从服务端获取数据拿到客户端操作,一切的工作将要在网络恢复后才能得以继续。
对于胖客户端技术,用户在使用这种软件时获得的最大的感官体验就是——它首先有自己独特的应用程序界面,而非通过浏览器,用户甚至还可以根据自己的喜好调整软件的布局,进行丰富的界面元素的设置,这些都是B/S模式的瘦客户端技术所不能媲美的。另外,用户还能获得较快的反应速度,程序可以充分利用本地机器的资源,在不使用网络访问远程资源时,本地资源的访问在正常情况下都能得到很快的处理。同样的,胖客户端技术也有着不尽人意的地方——在客户端进行部署时,由于客户端可能出现各种各样的情况,所以需要进行必要的设置,部署起来比较困难,如果对软件的版本进行升级,使用传统的DLL技术的那将更是一个大的挑战,因为在.NET之前,标准Windows DLL或COM组件可能出现“DLL Hell”——注册和更新软件中的DLL时,发现共享的DLL被最新版本改写了,并使该机器上的其他软件也因此不能运行。胖客户端有可能需要在客户端实现数据库支持,数据库放在本地有可能导致一些安全问题,因为相对于更重视安全的服务端,客户端相对而言还是比较脆弱的。
那么智能客户端技术便出现了,除了包括了胖/瘦客户端各自的优点外,它还具有如下四个最大的优点——
1) 充分利用终端设备的优势(full PC, PDA, phone都可以满足),因为核心部分在服务端(可能Web Service),所以终端只需实现表示层和一些简单逻辑;
2) 能够调用web services,在server端用web服务实现业务逻辑,处理各种请求,需要说明的是,由于业务逻辑实现放在客户端,因此一方面为客户端瘦身,另一方面也加强了软件的隐蔽性和安全性;
3) 支持在线和离线两种状态,用户可以在网络不可用时继续工作,并将数据临时存放在本地,当网络再次可用,数据便可传上服务器;
4) 能够如同Web应用程序一般简单方便的部署,.NET使用程序集技术,同一软件的不同版本可以共存于统一客户端。版本的升级也非常简单,软件访问服务端,能自动检测版本号,从而更新关键组件,实现升级。
SCSF与CAB的关系
tag:这里引用前辈们的一些见解http://blog.csdn.net/dawn023/article/details/3392256
CAB是一个为实现SCSF的框架,SCSF提供一些开发模版以及一些有用的Service,以方便程序员的开发。SCSF提供一些开发CAB程序的架构指导。SCSF提供一些工具集供开发人员使用。
SCSF与CAB基本概念
应用程序架构元素
CAB. Composite UI Application Block的缩写
Module. 应用程序的组成部件,其中包含SmartParts,支持Service,业务逻辑和配置信息等。一个.NET程序集合,为WorkItems, Service, 和其他支持类提供的一个物理容器。
ObjectBuilder.通过策略和配置信息自动创建对象实例的对象构造器。
Shell. 承载了用户接口元素,SmartPart,服务的外壳宿主程序。
Visualizer. CAB中提供的,可以查看应用程序中的WorkItem的动态分级视图的工具。
外壳元素
shell application. 主WinForm应用程序,CAB程序的各个部分的外部容器。它管理CAB的启动过程,承载了用户接口元素。
Shell Form Shell Application的主窗口。一般来说就是通常所说的Shell。它通常包含Workspaces和用户界面元素,如菜单和工具条。
SmartPart. 一个展现数据的视图,比如控件,Windows 窗体或是一个向导页。WorkItem所拥有的数据的可是展示或视图。它为WorkItem所拥有并显示在Workspace中。SmartPart一般就是WinForm控件的实现,一般包含其他的WinForm控件。除显示数据之外,也允许用户修改数据。
SmartPartInfo. 存放SmartPart的相关信息的类,以便被workspace所使用,比如可以在Smartpartinfo中设置SmartPart的显示标题。
UIElement. 一个以Shell作为宿主的控件,该控件能被多个Module所共享,这样的控件有:toolbar button , menuitem , status panel等
UIElement adapter. 管理特殊类型的UIElement的显示的类
Workspace. 封装了控件和SmartParts的某种可视化的布局的组件的容器窗口,比如以Tab方式显示页面。SmartPart一般是由WorkItem拥有的。Workspace可以控制SmartPart是显示还是隐藏。CAB提供了一些标准的Workspace类,当然也可以自定义
事件注册机制
(1)、Event Broker:事件代理,通过事件源和订阅事件源来达成对象之间的协作。
(2)、Event Publisher: 事件发布者,在CAB里是一个用属性EventPublication修饰的事件对象,提供特定的URL给Event Subscriber订阅。
(3)、Event Subscriber: 事件订阅者,在CAB里是一个用属性EventSubscription修饰的方法,根据修饰提供的URL自动寻找事件发布者。Publisher和 Subscriber之间由主题(由URL决定),消息(特定的 EventArgs),事件域(来确定是全局事件还是局部事件)来达成一致。其实这也是观察者模式的具体实现。
相关模式
Blackboard. 通过提供一个共享信息的地方,使其他组件能设置或获取这个地方的信息,已达到信息共享的模式。
Builder/Inversion of Control/Dependency Injection. 该模式通过组件之间的依赖关系进行运行时的注入,来达到组件重用和松散耦合的目的。
Event Broker. 允许松散耦合的组件通过发布订阅的方式进行通讯的模式。
Memento.持久化一个对象的内部状态状态,并在需要的时候可以在后期对状态进行恢复的模式。
Model-View-Controller (MVC). 该模式将领域模型,视图和基于用户输入产生的行为(控制器)分成3个不同的组成部分。视图部分提供给用户进行交互,交互信息通过视图传到控制器,控制器更新模型,模型引发事件,从而更新视图。关系图如下:
![](https://images.cnblogs.com/cnblogs_com/mixiaobo/Composite%20UI%20Application%20Block/mvc.png)
Model-View-Presenter (MVP). 该模式将领域模型,视图和基于用户输入产生的行为(控制器)分成3个不同的组成部分。视图部分提供给用户进行交互,交互信息通过视图传到控制器,控制器更新模型,模式触发事件到控制器,同时,控制器负责更新视图。关系图如下:
![](https://images.cnblogs.com/cnblogs_com/mixiaobo/Composite%20UI%20Application%20Block/mvp.png)
相关编程模型
Component. 应用程序的可视或非可视组成部件,比如SmartParts, services, 和控件.
Container. 包含了组件或服务的类。
event broker. 支持松散耦合的发布订阅事件机制的系统。
State. 存在于WorkItem中,以键-值的字典的方式来存放共享信息。
Service.以松散耦合的方式为其他的组件提供功能的组件(通常包含一些与其他WorkItem独立的工具方法。)。比如:ModuleLoaderService
WorkItem. 运行时的组件(对象)和服务的容器,该容器能协作其中封装的用例代码的执行。一般WorkItem和用例对应。一般作为CAB应用程序的组成部分存在。可以把它作为逻辑上的子程序或子进程。它是CAB程序的基本单元。用户所写的业务逻辑一般都在一个或多个WorkItem中。
相关角色
infrastructure developer. 负责进行应用程序的基础服务的开发的开发人员。
module developer. 负责进行应用程序的业务组件的开发的开发人员。
shell developer. 负责建立应用程序外壳的开发人员。
SmartPart developer. 负责开发应用程序的SmartParts的开发人员。
SCSF启动流程
详细启动流程释:http://www.cnblogs.com/flyabroad/archive/2008/06/16/1222948.html
//new ShellApplication().Run()的方法内部
public void Run(){
RegisterUnhandledExceptionHandler();
Builder builder = CreateBuilder();//首先创建Builder
AddBuilderStrategies(builder);//子类可以通过重写 AddBuilderStrategies方法来给ObjectBuilder添加其他构件策略(在构件对象或者销毁对象时执行)
CreateRootWorkItem(builder); //初始化RootWorkItem
IVisualizer visualizer = CreateVisualizer();//创建"观察者"
if (visualizer != null)//可选操作(用于在运行时查看workitem的状态)
visualizer.Initialize(rootWorkItem, builder); AddRequiredServices();//添加服务
AddConfiguredServices();//添加在配置文件中配置的服务,也就是 运行我们通过配置的方式决定在 SCSF 框架启动时加载额外服务(Services)。
AddServices();
AuthenticateUser();//验证用户
ProcessShellAssembly();//处理Shell程序集
rootWorkItem.BuildUp();//构建RootWorkItem
LoadModules();//通过配置加载模块
rootWorkItem.FinishInitialization(); //完成对 RootWorkItem 的创建,并触发创建完成事件
rootWorkItem.Run();// 执行 rootWorkItem 的 run 方法,该直接调用 protected virtual void OnRunStarted() 方法,OnRunStarted方法会触发 RunStarted 事件
Start(); // 启动应用(程序)
}
SCSF智能客户端学习笔记(一)的更多相关文章
- Leaflet客户端学习笔记
Leaflet介绍 Leaflet 是一个为建设交互性好适用于移动设备地图,而开发的现代的.开源的 JavaScript 库.代码仅有 33 KB,但它具有开发在线地图的大部分功能.支持插件扩展, L ...
- C++的智能指针学习笔记(初)
C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...
- Dynamic CRM 2013学习笔记(十)客户端几种查询数据方式比较
我们经常要在客户端进行数据查询,下面分别比较常用的几种查询方式:XMLHttpRequest, SDK.JQuery, SDK.Rest. XMLHttpRequest是最基本的调用方式,JQuery ...
- Dynamic CRM 2013学习笔记(二十三)CRM JS智能提示(CRM 相关的方法、属性以及页面字段),及发布前调试
我们知道在CRM的js文件里引用XrmPageTemplate.js后,就可以实现智能提示,但每个js文件都引用太麻烦了,其实可以利用vs的功能让每个js文件自动实现智能提示CRM的js: 另外,我们 ...
- [Firefly引擎][学习笔记四][已完结]服务器端与客户端的通讯
原地址:http://www.9miao.com/question-15-54981.html 传送门:学习笔记一学习笔记二学习笔记三 前言:学习笔记三是模块封装,这个在持续开发中会不断更新, 因为写 ...
- Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端
1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...
- Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程
1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...
- 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端
接上文 多线程编程学习笔记——使用异步IO 二. 编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...
- Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例
在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...
随机推荐
- 【MySQL】删除大表的讨论【转】
转自http://tech.ddvip.com/2013-07/1373269453198566.html 微博上讨论MySQL在删除大表engine=innodb(30G+)时,如何减少MySQL ...
- npm命令大全
参考网站:https://docs.npmjs.com/ 有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. npm 常用命令 npm install <name ...
- Excel 统计IP
参考资料: 1:http://zhidao.baidu.com/question/127624244.html 其中的公式改成<1就可以了. 2:http://support.office.mi ...
- C#时间处理--DateTime和TimeSpan
DateTime dt = DateTime.Now; dt.ToString();//2005-11-5 13:21:25 dt.ToFileTime().ToString();//12775641 ...
- GUI_DOWNLOAD参数说明
对FUNCTION: GUI_DOWNLOAD中某些参数的用法. call function 'GUI_DOWNLOAD' exporting * BIN_FILESIZE ...
- view上添加点手势 button无法响应点击事件
在view 上添加手势 有的时候 会把Button的 点击事件盖掉,这个 时候 我们用UITapGestureRecognizer的代理方法 //手势的代理方法 - (BOOL)gestureRec ...
- (转载)Android content provider基础与使用
android有一个独特之处就是,数据库只能被它的创建者所使用,其他的应用是不能访问到的,所以如果你想实现不同应用之间的数据共享,就不得不用content provider了.在Android中,co ...
- 内核linux-3.4.2支持dm9000
当前烧写: fs: nfs 30000000 192.168.1.17:/work/nfs_root/first_fs_mdev.yaffs2 //这里不能使用nfs挂载,只能直 ...
- CentOS 6.X版本升级PHP
#-----------------------------CentOS 6.X版本升级PHP------------------#! /bin/sh #1.关闭selinuxcp -rp /etc/ ...
- 一个用WPF做的简单计算器源代码
一.界面设计XAML代码 <Window x:Class="fengjisuanqi.MainWindow" xmlns="http://schemas.micro ...