Common Service Locator
来源:广州中睿信息技术有限公司
发布时间:2012/10/21 23:25:16 编辑:itlead 阅读 2382

     让你的应用不依赖于某种特定的Ioc或DI容器



  一、什么是Service Locator

  依赖注入是一种分离依赖的方式。注入的方式包括构造函数注入、setter注入,等等。Service Locator解决了同样的问题,但它采用了不同的方法。Service Locator保存了应用所需要的所有类型或对象。所以每当你需要使用一个类型或类的一个实例时,都可以要Service Locator提供实例。简单地说,Service Locator使用了一个容器,以容纳所有类别/类型实例/对象映射引用。

 

  二、为什么要用通用Service Locator?

  如今,作为一个.NET开发人员,我们通常都会选择使用DI/ IOC容器。市面上有很多选择,例如Sprint.NET、Unity、Castle Windsor等等,只要你在项目中使用其中的任何一种,就意味着你的项目将与此容器紧紧结合在一起。所以如果你开始在项目中使用Sprint.Net容器,那么你的项目将紧密结合Spring.NET的容器。但以后,如果你决定使用Unity容器,然后你能想象有多少麻烦等着你呢?你需要从你的代码中删除Spring.Net容器中的所有引用。另一个例子是,你正在开发一个将被其他用户使用的库。现在,如果你使用IoC容器(例如Sprint.Net),然后你强迫用户使用Sprint.Net每当他们要使用你开发的库。所以,如果能解开你的代码和IoC容器之间的耦合,那么你可以很容易地消除对Ioc容器的依赖,通用Service Locator就是旨在达到这个目标。

 

  三、使用通用Service Locator

  1. 理解 IServiceLocator 接口

  我们从一个叫IServiceLocator的接口开始,这个接口从IServiceProvider继承,有几个适合任何IOC容器的方法

  

  通用service Locator 会实现IServiceLocator接口. 其中一个基础的实现叫ServiceLocatorImplBase. 这个实现有两个抽象方法还是依赖于IOC容器:   

• DoGetAllInstances: 从容器中获得特定类型的所有实例  

• DoGetInstance: 从容器中活儿特定类型的一个实例   

以上两个抽象方法,将由ServiceLocatorImplBase 的子类去实现。

 

  2. 开发你自己的 Service Locator  

我已经分别为Unity和Spring.Net开发了两个 service Locator,其中UnityServiceLocator 可以使用Unity容器, 详细请看下面类图:       

图1:两个通用Service locator的实现

 

  3. 开发启动加载器   

我们已经有了两个通用的service locator,现在我需要分别开发两个启动加载器 :

       

 

这个通用的启动加载器有一个IServiceLocator的实例,所以我们可以把这个变量赋值为UnityServiceLocator 或SpringServiceLocator。

现在我们将为Unity和 Spring.Net实现具体的启动加载器,代码如下:

   

       如上面的代码所示, 这个UnityBootStrapper类需要重写CreateServiceLocator方法, 在这个方法中我们要创建一个 UnityContainer并放在 UnityServiceLocator中。 对于Spring.Net, 你可以创建一个SprintServiceLocator并把ObjectFactory放进去。

 

  4. 开发一个启动加载管理器,为访问Service Locator提供单一的入口   

        最后你需要开发一个启动加载管理器去隐藏子类的实现, 以下是BootStrapperManager的代码:  

     

 

  5. 通过BootStrapperManager访问IServiceLocator  

     现在,你需要在程序入口处把BootStrapper 注册到BootStrapperManager中,就像以下代码:

  

       到目前为止,我可以使用 CommonBootStrapper.Locator来取得 IServiceLocator 实例. 然后再从容器中获取任何想要的实例, 就像以下代码:  

     

 

 本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。