首页 > 代码库 > SCSF智能客户端学习笔记(一)
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智能客户端学习笔记(一)