2007年9月10日星期一

WorkItem

WorkItem是一个运行时容器,该容器中包含完成一个用例所需要了各种各样的组件,组件可以是可视化的也可以是非可视化的,比如:SmartPart,Service,Commonds等等。

WorkItem中定义了如下的属性:

  • Services

Services是一个集合,用来管理所有和实现一个用例相关的Service,可以通过如下代码将一个Service添加到WorkItem中:

WorkItem.Services.AddNew<TestService, ITestService>();

上述的代码中,第一个参数是一个具体Service的实现,第二个参数是该Service的接口。

一旦将一个Service添加到WorkItem中,该WorkItem中的其它组件(比如SmartPart)可以使用如下代码获取该Service的一个引用。

ITestSerivce service = WorkItem.Services.Get<ITestService>();

  • SmartParts

同样,我们也可以向一个WorkItem中添加一个SmartPart:

TestView view = WorkItem.SmartParts.AddNew<TestView>("TestView");

我们也可以通过下面方法获取一个已经存在的SmartPart

TestView view = WorkItem.SmartPart.Get("TestView");

同时使用下面代码将一个SmartPart显示在Workspace中:

if(view == null )

{

     TestViewview=WorkItem.SmartParts.AddNew<TestView> ("TestView");

     WorkItem.Workspaces[WorkspaceNames.XXXXX].Show(view);

else

{

      WorkItem.Workspaces[WorkspaceNames.XXXXX].Activate(view);

}

在这段代码中,我们不难发现,当一个SmartPart已经存在的时候,我们不需要再添加一个实例到WorkItem中,这样可以保证对同一个SmartPart来说,只有一个实例在WorkItem中。

  • Workspaces

Workspaces的设计和上面SmartParts的设计一致,我们可以通过一个Workspace的唯一名字来获取对应的Workspace实例。

WorkItem.Workspaces[WorkspaceNames.XXXXX]

  • UIExtensionSites

同样,UIExtensionSites也是一个集合,用来管理UIExtensionSite,我们可以通过下列方法将一个UIExtensionSite添加到WorkItem中:

WorkItem.UIExtensionSites.RegisteSite(UIExtensionSiteNames.XXXX, XXXXXXX;

将一个UIExtensionSite添加WorkItem之后,我们可以用下列方法添加一个UIElement到UIExtensionSite中,比如在ToolBarStrip上添加一个Button:

WorkItem.UIExtensionSites[Constants.UIExtensionSiteNames.ButtonsBar].Add(new ToolStripButton());

  • Commands

Commands集合用来管理Command,

WorkItem.Commands[Constants.CommandNames.TestButtonClick].AddInvoker(element, "Click");

WorkItem中还定义了其它一些集合变量,比如Events,WorkItems和Items。这里我们就不一一详述。

 

WorkItem hierarchy

在CAB中,WorkItem具有一定的层次,最顶端的WorkItem是RootWorkItem,它在整个应用程序中是唯一的。RootWorkItem会在应用程序开始的时候加载,当我们使用SCSF创建一个业务模块的时候,它自动会创建一个WorkItem,并在该模块加载的时候,将该WorkItem添加到RootWorkItem中去。一个WorkItem中的组件可以访问同一WorkItem中的其它组件,同时也可以访问父WorkItem中的组件。基本的访问规则如下,一个组件可以访问下列组件:

  • 同一WorkItem中的
  • 父WorkItem中的
  • 祖父WorkItem中的(以此类推)

由此我们可以看出,RootWorkItem中的组件对于整个应用程序来说是共享的。我们可以activated and deactivated WorkItem。在同一时刻,只有一个WorkItem是处于激活状态。

从更高的层次上来说,一个WorkItem封装了一个Use-Case。WorkItem的层次性关系反映了业务中UseCases之间的关系。这样的一种关系可以帮助我们在设计阶段识别出相应的WorkItems。但是也并不是粒度越细越好,详细WorkItem设计参考其它文章。

没有评论: