- 问题
一般来说,一个应用程序包含多个WorkItem(工作项)和服务,一个WorkItem仅可以包含同一服务的一个实例,同一服务的多个实例被放置在多个WorkItem中。你想使用多个WorkItem中的多个服务实例,同时也可以优先使用某一个WorkItem下的服务实例,每一个WorkItem都可以从WorkItem层次结构的当前位置获取正确的服务实例。
- 解决方案
WorkItem尝试从自己的服务集合中定位服务实例,如果不能定位所需服务,则询问上级WorkItem来定位服务,这个动作将会持续到服务被定位或到达顶层结点的WorkItem为止。
- 示例
在Composite UI Application Block中,Locator对象负责定位WorkItem及其上级中的服务,每一个WorkItem保存着一个Locator对象实例,它是在WorkItem初始化的时候被创建的,如果WorkItem有一个上级WorkItem,那么此WorkItem的Locator对象就包含一个上级WorkItem中Locator对象的引用(Locator对象在层次结构中是互相连接的)。
Locator对象包含WorkItem中服务的引用,以下代码返回IMyService服务的一个实例,这个实例可以从一个MyWorkItem或者从其上级而来,MyWorkItem相关的Locator对象通过调用myWorkItem.Sevices.Get
要添加服务实例到一个WorkItem中,你可以既显式地创建一个实例并且添加到WorkItem中,也可以指示ObjecBuilder来为你创建实例。
以下代码显式地创建一个服务实例:
2 myWorkItem.Services.Add<IMyService>(service);
以下代码使用ObjectBuilder创建服务实例: