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设计参考其它文章。
没有评论:
发表评论