转载自:https://www.cnblogs.com/gaochundong/archive/2013/04/12/service_locator_pattern.html
什么是Service Locator 模式?
服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装。该模式使用一个称为"Service Locator"的中心注册表来处理请求并返回处理特定任务所需的必要信息。
场景描述
某类ClassA依赖于服务ServiceA和服务ServiceB,服务的具体类型需在编译时指定。
![](https://i-blog.csdnimg.cn/blog_migrate/9dc50761e14652cdabdfc4bde3f0d374.png)
这种条件下有以下缺点:
- 尝试替换或更新依赖项,必须更改类的源代码并且重新编译。
- 依赖项的具体实现必须在编译时可用。
- 测试该类非常困难,因为类对依赖项有直接的引用,则依赖项不能使用Stub或Mock对象替换。
- 该类包含用于创建、定位和管理依赖项的重复代码。
设计目标
使用 Service Locator Pattern 来达成以下目标:
- 把类与依赖项解耦,从而使这些依赖项可被替换或者更新。
- 类在编译时并不知道依赖项的具体实现。
- 类的隔离性和可测试性非常好。
- 类无需负责依赖项的创建、定位和管理逻辑。
- 通过将应用程序分解为松耦合的模块,达成模块间的无依赖开发、测试、版本控制和部署。
解决方案
创建一个 Service Locator,其包含各服务的引用,并且封装了定位服务的逻辑。在类中使用 Service Locator 来获取所需服务的实例。
![](https://i-blog.csdnimg.cn/blog_migrate/5a103d5cbb154545db6f11d1b43671b3.png)
Service Locator 模式并不描述如何实例化服务,其描述了一种注册和定位服务的方式。通常情况下,Service Locator 模式与工厂模式(Factory Pattern)和依赖注入模式(Dependency Injection Pattern)等结合使用。
服务定位器应该能够在不知道抽象类的具体类型的情况下定位到服务。例如,它可能会使用字符串或服务接口类型来影射服务,这允许在无需修改类的条件下替换依赖项的具体实现。
实现细节
通常 ServiceLocator 类提供 IServiceLocator 接口的实现单例,并负责管理该实例的创建和访问。ServiceLocator 类提供 IServiceLocator 接口的默认实现,例如 ActivatingServiceLocator 类,可以同时创建和定位服务。
注意事项
在使用 Service Locator 模式之前,请考虑以下几点:
- 有很多程序中的元素需要管理。
- 在使用之前必须编写额外的代码将服务的引用添加到服务定位器。
- 类将对服务定位器有依赖关系。
- 源代码变的更加复杂和难以理解。
- 可以使用配置数据来定义运行时的关系。
- 必须提供服务的实现。因为服务定位器模式将服务消费者与服务提供者解耦,它可能需要提供额外的逻辑。这种逻辑将保证在服务消费者尝试定位服务之前,服务提供者已被安装和注册。
相关模式
- 依赖注入(Dependency Injection)。这种模式解决了与 Service Locator 模式相同的问题,但它使用不同的方法。
- 控制反转(Inversion of Control)。Service Locator 模式是这种模式的特殊版本。它将应用程序的传统控制流程反转。它用被调用对象来代替控制过程的调用方。
参考信息
代码示例
Service Locator 的简单实现,使用静态类实现,未使用Singleton设计,仅作Mapping影射。
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
namespace Infrastructure
{
/// <summary>
/// 服务定位器
/// </summary>
public static class ServiceLocator
{
#region Fields
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">readonly</span> Dictionary<Type, Type> _mapping <br> = <span style="color: #0000ff;">new</span> Dictionary<Type, Type><span style="color: #000000;">();
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">readonly</span> Dictionary<Type, <span style="color: #0000ff;">object</span>> _resources <br> = <span style="color: #0000ff;">new</span> Dictionary<Type, <span style="color: #0000ff;">object</span>><span style="color: #000000;">();
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">object</span> _operationLock = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">object</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> Add
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 添加注册资源
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TClass"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></typeparam></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="instance"></span><span style="color: #008000;">资源实例</span><span style="color: #808080;"></param></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Add<TClass>(<span style="color: #0000ff;">object</span><span style="color: #000000;"> instance)
</span><span style="color: #0000ff;">where</span> TClass : <span style="color: #0000ff;">class</span><span style="color: #000000;">
{
Add(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass), instance);
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 添加注册资源
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="typeOfInstance"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="instance"></span><span style="color: #008000;">资源实例</span><span style="color: #808080;"></param></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Add(Type typeOfInstance, <span style="color: #0000ff;">object</span><span style="color: #000000;"> instance)
{
</span><span style="color: #0000ff;">if</span> (typeOfInstance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #800000;">"</span><span style="color: #800000;">typeOfInstance</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span> (instance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #800000;">"</span><span style="color: #800000;">instance</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span> (!<span style="color: #000000;">(typeOfInstance.IsInstanceOfType(instance)))
{
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> InvalidCastException(
</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.Format(CultureInfo.InvariantCulture,
</span><span style="color: #800000;">"</span><span style="color: #800000;">Resource does not implement supplied interface: {0}</span><span style="color: #800000;">"</span><span style="color: #000000;">, <br> typeOfInstance.FullName));
}
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (_resources.ContainsKey(typeOfInstance))
{
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> ArgumentException(
</span><span style="color: #0000ff;">string</span>.Format(CultureInfo.InvariantCulture, <br><span style="color: #800000;"> "</span><span style="color: #800000;">Resource is already existing : {0}</span><span style="color: #800000;">"</span><span style="color: #000000;">, typeOfInstance.FullName));
}
_resources[typeOfInstance] </span>=<span style="color: #000000;"> instance;
}
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> Get
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 查找指定类型的资源实例
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TClass"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></typeparam></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></span><span style="color: #008000;">资源实例</span><span style="color: #808080;"></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> TClass Get<TClass><span style="color: #000000;">()
</span><span style="color: #0000ff;">where</span> TClass : <span style="color: #0000ff;">class</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">return</span> Get(<span style="color: #0000ff;">typeof</span>(TClass)) <span style="color: #0000ff;">as</span><span style="color: #000000;"> TClass;
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 查找指定类型的资源实例
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="typeOfInstance"></span><span style="color: #008000;">The type of instance.</span><span style="color: #808080;"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></span><span style="color: #008000;">资源实例</span><span style="color: #808080;"></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">object</span><span style="color: #000000;"> Get(Type typeOfInstance)
{
</span><span style="color: #0000ff;">if</span> (typeOfInstance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #800000;">"</span><span style="color: #800000;">typeOfInstance</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> resource;
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
</span><span style="color: #0000ff;">if</span> (!_resources.TryGetValue(typeOfInstance, <span style="color: #0000ff;">out</span><span style="color: #000000;"> resource))
{
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> ResourceNotFoundException(typeOfInstance.FullName);
}
}
</span><span style="color: #0000ff;">if</span> (resource == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
{
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> ResourceNotInstantiatedException(typeOfInstance.FullName);
}
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> resource;
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 尝试查找指定类型的资源实例
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TClass"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></typeparam></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="resource"></span><span style="color: #008000;">资源实例</span><span style="color: #808080;"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></span><span style="color: #008000;">是否存在指定资源类型的资源实例</span><span style="color: #808080;"></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> TryGet<TClass>(<span style="color: #0000ff;">out</span><span style="color: #000000;"> TClass resource)
</span><span style="color: #0000ff;">where</span> TClass : <span style="color: #0000ff;">class</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">bool</span> isFound = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
resource </span>= <span style="color: #0000ff;">null</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> target;
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
</span><span style="color: #0000ff;">if</span> (_resources.TryGetValue(<span style="color: #0000ff;">typeof</span>(TClass), <span style="color: #0000ff;">out</span><span style="color: #000000;"> target))
{
resource </span>= target <span style="color: #0000ff;">as</span><span style="color: #000000;"> TClass;
isFound </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
}
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> isFound;
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> Register
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 注册类型
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TClass"></span><span style="color: #008000;">实体类型,类型限制为有公共无参构造函数</span><span style="color: #808080;"></typeparam></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> RegisterType<TClass><span style="color: #000000;">()
</span><span style="color: #0000ff;">where</span> TClass : <span style="color: #0000ff;">class</span>, <span style="color: #0000ff;">new</span><span style="color: #000000;">()
{
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
_mapping[</span><span style="color: #0000ff;">typeof</span>(TClass)] = <span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass);
}
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 注册类型
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TFrom"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></typeparam></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TTo"></span><span style="color: #008000;">实体类型,类型限制为有公共无参构造函数</span><span style="color: #808080;"></typeparam></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> RegisterType<TFrom, TTo><span style="color: #000000;">()
</span><span style="color: #0000ff;">where</span> TFrom : <span style="color: #0000ff;">class</span>
<span style="color: #0000ff;">where</span> TTo : TFrom, <span style="color: #0000ff;">new</span><span style="color: #000000;">()
{
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
_mapping[</span><span style="color: #0000ff;">typeof</span>(TFrom)] = <span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TTo);
_mapping[</span><span style="color: #0000ff;">typeof</span>(TTo)] = <span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TTo);
}
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 是否已注册此类型
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TClass"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></typeparam></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></span><span style="color: #008000;">是否已注册此类型</span><span style="color: #808080;"></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> IsRegistered<TClass><span style="color: #000000;">()
{
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
</span><span style="color: #0000ff;">return</span> _mapping.ContainsKey(<span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass));
}
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> Resolve
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 获取类型实例
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TClass"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></typeparam></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><returns></span><span style="color: #008000;">类型实例</span><span style="color: #808080;"></returns></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> TClass Resolve<TClass><span style="color: #000000;">()
</span><span style="color: #0000ff;">where</span> TClass : <span style="color: #0000ff;">class</span><span style="color: #000000;">
{
TClass resource </span>= <span style="color: #0000ff;">default</span><span style="color: #000000;">(TClass);
</span><span style="color: #0000ff;">bool</span> existing = TryGet<TClass>(<span style="color: #0000ff;">out</span><span style="color: #000000;"> resource);
</span><span style="color: #0000ff;">if</span> (!<span style="color: #000000;">existing)
{
ConstructorInfo constructor </span>= <span style="color: #0000ff;">null</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
</span><span style="color: #0000ff;">if</span> (!_mapping.ContainsKey(<span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass)))
{
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> ResourceNotResolvedException(
</span><span style="color: #0000ff;">string</span>.Format(CultureInfo.InvariantCulture, <br><span style="color: #800000;"> "</span><span style="color: #800000;">Cannot find the target type : {0}</span><span style="color: #800000;">"</span>, <span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass).FullName));
}
Type concrete </span>= _mapping[<span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass)];
constructor </span>= concrete.GetConstructor(<br> BindingFlags.Instance | BindingFlags.Public, <span style="color: #0000ff;">null</span>, <span style="color: #0000ff;">new</span> Type[<span style="color: #800080;">0</span>], <span style="color: #0000ff;">null</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span> (constructor == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
{
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> ResourceNotResolvedException(
</span><span style="color: #0000ff;">string</span>.Format(CultureInfo.InvariantCulture, <br><span style="color: #800000;"> "</span><span style="color: #800000;">Public constructor is missing for type : {0}</span><span style="color: #800000;">"</span>, <span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass).FullName));
}
}
Add</span><TClass>((TClass)constructor.Invoke(<span style="color: #0000ff;">null</span><span style="color: #000000;">));
}
</span><span style="color: #0000ff;">return</span> Get<TClass><span style="color: #000000;">();
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> Remove
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 移除指定类型的资源实例
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TClass"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></typeparam></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Remove<TClass><span style="color: #000000;">()
{
Teardown(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass));
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 移除指定类型的资源实例
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="typeOfInstance"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></param></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> Remove(Type typeOfInstance)
{
</span><span style="color: #0000ff;">if</span> (typeOfInstance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #800000;">"</span><span style="color: #800000;">typeOfInstance</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
_resources.Remove(typeOfInstance);
}
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> Teardown
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 拆除指定类型的资源实例及注册映射类型
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="TClass"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></typeparam></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Teardown<TClass><span style="color: #000000;">()
{
Teardown(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TClass));
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 拆除指定类型的资源实例及注册映射类型
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="typeOfInstance"></span><span style="color: #008000;">资源类型</span><span style="color: #808080;"></param></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> Teardown(Type typeOfInstance)
{
</span><span style="color: #0000ff;">if</span> (typeOfInstance == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> ArgumentNullException(<span style="color: #800000;">"</span><span style="color: #800000;">typeOfInstance</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
_resources.Remove(typeOfInstance);
_mapping.Remove(typeOfInstance);
}
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">#region</span> Clear
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 移除所有资源
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> Clear()
{
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (_operationLock)
{
_resources.Clear();
_mapping.Clear();
}
}
</span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">
}
}
Service Locator 测试代码
using System;
using Infrastructure;
namespace ServiceLocatorTest
{
class Program
{
interface IServiceA
{
string GetData();
}
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> ServiceA : IServiceA
{
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> GetData()
{
</span><span style="color: #0000ff;">return</span> <span style="color: #800000;">"</span><span style="color: #800000;">This data is from ServiceA</span><span style="color: #800000;">"</span><span style="color: #000000;">;
}
}
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)
{
ServiceLocator.RegisterType</span><IServiceA, ServiceA><span style="color: #000000;">();
IServiceA serviceA </span>= ServiceLocator.Resolve<IServiceA><span style="color: #000000;">();
</span><span style="color: #0000ff;">string</span> data =<span style="color: #000000;"> serviceA.GetData();
Console.WriteLine(data);
Console.ReadKey();
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/c96425382d1bc649a7eabc2cdfc6e833.png)