博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Service Locator 模式 [翻译]

Posted on 2008-10-07 16:49  洪博士™  阅读(602)  评论(0)    收藏  举报
  • 问题

一般来说,一个应用程序包含多个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来获取服务:

IMyService service = myWorkItem.Services.Get<IMyService>(); 

 

要添加服务实例到一个WorkItem中,你可以既显式地创建一个实例并且添加到WorkItem中,也可以指示ObjecBuilder来为你创建实例。

以下代码显式地创建一个服务实例:

1 MyService service = new MyService(); 
2 myWorkItem.Services.Add<IMyService>(service); 

 

以下代码使用ObjectBuilder创建服务实例:

1 myWorkItem.Services.AddNew<MyService, IMyService>();