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个不同的组成部分。视图部分提供给用户进行交互,交互信息通过视图传到控制器,控制器更新模型,模型引发事件,从而更新视图。关系图如下:
Model-View-Presenter (MVP). 该模式将领域模型,视图和基于用户输入产生的行为(控制器)分成3个不同的组成部分。视图部分提供给用户进行交互,交互信息通过视图传到控制器,控制器更新模型,模式触发事件到控制器,同时,控制器负责更新视图。关系图如下:
相关编程模型
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实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...
随机推荐
- Material Design参考资料
传送门: http://www.uisdc.com/comprehensive-material-design-note
- [AngularJS 1] Introduction to AngularJS
introduction:this article is going to introduce AngularJS in generally. I will write it through five ...
- mysql时间日期相加相减实现
分享篇mysql中日期的一些操作,就是我们常常会用到的mysql时间日期的相加或者相减的了,这个mysql也自己带了函数,有需要的朋友可以参考一下. 最简单的方法 select TO_DAYS(str ...
- Sublime 3114 + 转换GBK方法
下载地址: http://files.cnblogs.com/files/wuyifu/Sublime_Text_Build_3114_x64_Setup.zip -– BEGIN LICENSE - ...
- iPhone 6 (iOS 9.2) extractiion failed by XRY
My colleague extracted an iPhone 6 with XRY and it is iOS 9.2 . Unfortunately the Wizard crashed and ...
- 定时器Timer
定时器类:Timer 构造函数:Timer(TimerCallback callback, object state, uint dueTime, uint period) callback:中断处理 ...
- CTest
一.初识CTest CTest是CMake集成的一个测试工具,在使用CMakeLists.txt文件编译工程的时候,CTest会自动configure.build.test和展现测试结果 CTest有 ...
- Objective-C控制语句
Objective-C控制语句有以下三类: 分支语句:if-else,switch 循环语句:while,do-while,for 与程序转移相关的跳转语句:break,continue,goto. ...
- luigi学习3-使用luigid
--local-scheduler的方式只适用于开发调试阶段,当你真正要把程序部署到一个产品时,我们推荐使用luigid服务. 使用luigid服务不但能提供锁服务(防止一个任务被多个进程重复执行), ...
- PHP实习生面经--两天四面
这两天一共面了四家公司,之前投了很多还在想怎么没有叫面试的,后来接连来了四个.下面一个一个做个总结. 1.创想空间(www.quanshi.com) 在五环边上的软件园里,占了一个楼的大概一层吧,算是 ...