CAB随心所欲的逻辑.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通过CAB & SCSF迅捷构建集成式桌面应用程序
Composite UI Application Block (CAB)是一个程序框架,Smart Client Software Factory (SCSF)也是一个框架,它们都是应用于桌面应用程序的Framework。

不过SCSF是对CAB塑料薄膜般的轻薄封装。

进而使基于CAB的应用程序更加一致,不过代价是工程结构略显呆板,其实 CAB和 SCSF 都系出名门,有纯净的贵族血统,它们是微软公司模式与实践小组(P&P)开发的(MVC)序框架,用来规范开发领域内的复杂逻辑关系。

P&P同时还是Enterprise Library和 WEB Client Software Factory 的设计者。

配置
自从15年前GOF23提出以来,诸多的软件设计者实践着这23种设计模式,其中的苦辣与心酸恐怕只有自己知道。

微软的模式与实践小组也是GOF23的践行者,他们为我们奉献的就是在Microsoft.Practices命名空间下构建的一系列Block。

CAB 和SCSF也是一堆Block。

是微软中一些GOF23的践行者们为构建集成式桌面应用程序敲打出的一个设计构架。

MVC(Model View Controller)模式是一种广泛使用的设计模式,模式是一种广泛使用的设计模式,它将应用程序根据功能不同划分为3个主要部分,它们分别是模型、视图和控制器。

CAB是MVC的微软实现,这一点在开发中要时刻牢记,它没有在NET程序中加如任何新的语言元素,是对NET桌面程序的包装。

CAB提供了基于桌面程序的MVC解决方案,应用CAB可以开发扩展性高、测试容易、逻辑划分清楚的应用程序。

所谓模型,就是CAB中要被显示的数据,通常情况下模型要从数据库中读取数据、保存模型的状态等,并且提供数据的访问方法及数据的维护。

视图将回答如何在程序中显示我们引入模型中的数据,并决定人机交互的过程,就是显示模型的用户界面。

控制是用来处理用户的输入或交互命令,以便改变模型的状态,选择适当的视图来显示对应模型的数据。

在了解MVC后,进一步观察CAB中的MVC。

CAB程序一般都有如下的结构。

1、派生于FormShellApplication<myWorkItem, mainFrom>的主程序。

2、定义“用例”的myWorkItem是从WorkItem类派生的。

3、mainFrom就是一个平常的From,作为应用程序的主窗口被创建显示。

有一系列的Workspace在From上定位,
Workspace是一种类型的容器,起到视图的作用。

4、在工程中还有ProfileCatalog.xml配置,它负责外从部引入功能模块。

我们可以在程序外部以动态库的
形式建立功能模块。

从CAB的外部观察基本上就是这些,在介绍第一个简单的CAB程序前先熟悉一下CAB的成员对象。

Shell Application 引导Form的过程建立。

WorkItem 容器放UI控件,SmartPart,各种服务和其他的组件。

它表示了我们要完成的一个业务逻辑。

SmartPart 在Form中容纳用户的客户组件。

就是每个功能模块的最小视图,自定义控件
UIElement 菜单等。

Command 事件委托。

Event 发布和订阅。

SmartPartInfo 决定SmartPart的状态。

Service 各种服务。

State 程序数据对象缓存。

WorkSpace 控件显示视图。

一个简单的程序
using System;
using System.Windows.Forms;
using positeUI;//对CAB进行引用
using System.Collections.Generic;
using positeUI.WinForms; /对CAB进行引用
using System.Threading;
namespace SmartPartQuickStart
{
//建立CAB的外壳类,它派生于FormShellApplication,BrowseCustomersWorkItem代表一个业务逻辑,MainForm是主窗口。

SmartPartApplication().Run()进入主消息循环,显示窗口,BeforeShellCreated、AfterShellCreated和OnUnhandledException功能如其命名。

class SmartPartApplication : FormShellApplication
<BrowseCustomersWorkItem.BrowseCustomersWorkItem, MainForm>
{
///<summary>
/// The main entry point for the application.
///</summary>
[STAThread]
public static void Main()
{
new SmartPartApplication().Run();
}
protected override void BeforeShellCreated()//外壳建立之前应用
{
base.BeforeShellCreated();
RootWorkItem.State["Customers"] = new List<Customer>();//建立(消费者)集合,到根路径中。

}
protected override void AfterShellCreated()
{
base.AfterShellCreated();
}
#region Unhandled Exception
public override void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Exception ex = e.ExceptionObject as Exception;
if (ex != null)
{
MessageBox.Show(BuildExceptionString(ex));
}
else
{
MessageBox.Show("An Exception has occured, unable to get details");
}
Environment.Exit(0);
}
private string BuildExceptionString(Exception exception)
{
string errMessage = string.Empty;
errMessage +=
exception.Message + Environment.NewLine + exception.StackTrace;
while (exception.InnerException != null)
{
errMessage += BuildInnerExceptionString(exception.InnerException);
exception = exception.InnerException;
}
return errMessage;
}
private string BuildInnerExceptionString(Exception innerException)
{
string errMessage = string.Empty;
errMessage += Environment.NewLine + " InnerException ";
errMessage += Environment.NewLine + innerException.Message + Environment.NewLine + innerException.StackTrace;
return errMessage;
}
#endregion
}
}
方法方法
方法
属性
方法属性方法
上图基本说明了FormShellApplication的继承关系。

值得一题的是方法Run()和Start()方法。

public void Run()
{
RegisterUnhandledExceptionHandler();
Builder builder = CreateBuilder();//建立通过一个ObjectBulid建立注入,将实现订阅和命令
AddBuilderStrategies(builder);// 定义其他构建的策略补充
CreateRootWorkItem(builder);//通过ObjectBuilder建立根的WorkItem容器保存所有的只容器
///////////////
// 在配置文件中定义的监视类帮助调试,须要实现一个自定义的IVisualizer类并在配置文件中申明。

/////////////////////////////////////
IVisualizer visualizer = CreateVisualizer();
if (visualizer != null)
visualizer.Initialize(rootWorkItem, builder);
/////////////////////////////////////
AddRequiredServices();//添加必要的服务
AddConfiguredServices();//在配置文件中建立服务
AddServices();//虚方法,添加用户定义的服务
AuthenticateUser();//AuthenticationService获得角色。

ProcessShellAssembly();//ModuleLoaderService读入程序集
rootWorkItem.BuildUp();//rootWorkItem被正式的构建。

LoadModules();
rootWorkItem.FinishInitialization();//完成rootWorkItem的初始化工作
rootWorkItem.Run();//rootWorkItem运行,是建立在Application.RUN 前的。

Start();//消息循环建立
//循环退出清理现场操作;
rootWorkItem.Dispose();
if (visualizer != null)
visualizer.Dispose();
}
protected override void Start()
{Application.Run(Shell);}
Start()方法进入了正常的消息循环。

相关文档
最新文档