组合界面程序块介绍(Composite UI Application Block)
看来微软要全力推SmartClient了,Application Block推出了一个又一个。我们这个项目既然要用SmartClient,自然会关注这些好东
东。目前我们确定要使用的Application Block 包括, Offline 和 CompositeUI 。有的同学就会说,这些个Block实在是太复杂,不好用。确
实他们的代码都很复杂,满是什么模式XXX一大堆。但是用起来却不是很难。这里就介绍一下CAB(Composite UI Application Block)的基本使
用方法。注意是使用方法和一些使用原则的东西,因为还没有深入去分析具体的代码。
首先介绍一下CAB是个什么东西,CAB最大的特征是她就是一个IOC界面容器,它可以根据容器内组件的依赖关系自行组装,以解除耦合,CAB中
的View,Controler,以及Service组件都是通过该容器自行组装,以完成业务操作。CAB中的 Event attribute 和 command attribute 又为解
耦提供了许多方便。
下面中就几个主要和我们打交道的类做一下介绍。
(1) SmartParts
就是我们最小的界面组件,并且和WorkItem中的View一一对应。声明SmartPart的方式也非常简单。比如
[SmartPart] public partial class DropRegistration : UserControl { }
在类DropRegistration上面加上[SmartPart]这个属性就好。容器就会认为这个是一个SmartPart,在需要的时候会将其注入到需要的类中。一般
在View上设计展示给用户的最小元素,比如一个登陆框。你可以用SmartPartHolder或是WorkSpace来装载显示它。
(2) WorkSpace
是显示组件的容器,WorkSpace中的WorkItem都是通过传入的WorkSpace来显示自己。CAB中提供了几种WorkSpace,不同的展示方式。
1)MdiWorkspace:把WorkItem 作为一个子窗体进行显示,与平常的MDI窗体相似。
2)TabWorkspace: 以tag的形式显示WorkItem。
3)DeckWorkspace: 以平铺的形势,一次只显示一个WorkItem。
4)ZoneWorkspace:这个还没试过,找个时间补齐 ^_^。
(3)WorkItems
这个家伙是一个用例中不同组件的运行时容器。所以在项目中决定以用例来划分WorkItem,来作为我们的一个原则之一。
在一个WorkItem中包含了重要的方法、属性还有成员.
1) 首先当然是初始化的方法,每个WorkItem都必须实现Run(IWorkspace workspace)方法.
2) 每个WorkItem都有State,你可以把它想象成Asp.net中的Session一样,可以把一些在本WorkItem中传递的信息存到State中。
这样在这个WorkItem中的都可以访问他。要实现这并不难。在你类属性上面加上[State]的属性比如:
[SmartPart] public partial class DropRegistration : UserControl { [State] private Customer customer = null ; public CustomerDetailView() { InitializeComponent(); } private void CustomerSummaryView_Load( object sender, EventArgs e) { if ( ! DesignMode) { customerBindingSource.Add(customer); } }
就表示用的是State中的该类型的信息,在窗体加载的时候就可以直接绑定customer信息到窗体中,而没有在此之间发现实例
化的代码。
3) WorkItem 中运用到了MVC模式。所以包括了View和Controller,一般情况下一个View和一个Controller.
(4)ApplicationHost
Application host 是应用程序中的各种组件的组织体。程序的WorkItem均运行于Application Host之上。他是CAB容器的入口。
(5) Services
CAB 中提供了一系列的基础服务类以供在程序中使用。当然你也可以实现自己特殊功能的服务。这里介绍CAB中的几种重要的服务:
1) Catalog Reader Service: 用于读取配置目录的服务。
2) Event Broker Service : 事件代理服务,符合CAB中事件声明规则的事件可以通过它来传递,很多时候解耦就靠它哦。
3) Module Loader Service : 模块加载服务,目前用的比较少,或是用了没感觉.
4) Authentication Service : 估计我们会借鉴一下然后,自己实现一套.
5) State Persistence Service : WorkItem中的状态持久化服务,用以保存WorkItem的State中的信息到持久层。
(6) Modules
模块由以上说到的 Services, WorkItems, SmartParts, Controllers, Business Entities 组成. 从最直观的形象上说就是一个Dll,一
个子系统。他有自己的初始化方法Start(),用于初始化本模块和运行它的WorkItems.
基础的东西就先介绍到这里,希望对组员有所帮助。以后会随着研究的深入,继续在Blog上探讨CAB的各个特性以及使用的方式。