标签: common-service-locator

您什么时候使用公共服务定位器?

我一直在寻找Common Service Locator作为抽象我的IoC容器的方法,但我注意到有些人强烈反对这种类型.

人们建议永远不要使用它吗?一直在使用它?或者有时使用它?如果有时候,那么在什么情况下你会使用它以及你不会使用它的情况.

c# dependency-injection inversion-of-control common-service-locator service-locator

36
推荐指数
3
解决办法
1万
查看次数


IServiceLocator.GetInstance(Type)的意图与IServiceProvider.GetService(Type)的意图有何不同?

是否有方法签名的意图的差异IServiceProvider.GetService(Type serviceType)IServiceLocator.GetInstance(Type serviceType)?如果是这样,区别是什么?

我总是将它们视为等效的,但可以选择使用单一方法来保持一致性.对于处理这两个接口来说,这似乎是一个很好的解决方案,但我真的很想知道它们的用法是如何实际的,这样我才能确定我在正确的位置使用正确的用法. 如果他们的意图实际上是相同的,那么是否有任何理由为同一目的设置多组语义?(据我所知,GetInstance出现之初被推荐的签名Microsoft.Practices.ServiceLocation,但是这并没有真正看起来像一个充分的理由,介绍重复).

为什么我很困惑

以下是我在试图找到这个问题的答案时发现的有时相互矛盾的事实清单,以及我对此的解释.我将这些内容包含在内,以便可以在已知有关该主题的所有信息的上下文中解决我的问题.

  • 为MSDN文档IServiceProvider说,该GetService(Type serviceType)方法应该返回

    serviceType 类型的服务对象.
    - 或者 - 如果没有serviceType类型的服务对象,则返回
    null.
  • 为MSDN文档IServiceLocator缺少方法的文档,但在的VS对象浏览器中总结GetInstance(Type serviceType)说,该方法返回"请求的服务实例".但是,文档IServiceLocator中还有一个异常条目,表示ActivationException如果解析服务实例时出错,则应抛出该条目.

  • ActivationException位于Microsoft.Practices.ServiceLocation引入多年后IServiceProvider引入的命名空间中.因此,可以理解的是,IServiceProvider它并未引用异常.话虽这么说,如果没有找到结果,IServiceLocator界面的文档没有说明返回null.还不清楚是否缺乏所要求的服务类型的实施应构成例外.

  • 如果没有为服务类型的实现会导致ActivationExceptionIServiceLocator实现? 看起来不像.用于忽略非空后置条件的任何概念的实现模板IServiceLocator.

  • 实施模板IServiceLocator也把IServiceProvider.GetService(Type)作为替代语法IServiceLocator.GetInstance().这是否违反Liskov(由于在基类型上未声明的子类型中抛出异常),或者,实际上是否需要在实现中有所不同,而不是在接口的方法签名上声明的异常?我得到的是:我们确定实现的ServiceLocatorImplBase实现模板IServiceLocator都正确接口吗? …

c# dependency-injection common-service-locator service-locator base-class-library

11
推荐指数
1
解决办法
2523
查看次数

公共服务定位器是否被广泛使用?

我现在正在开发一个新项目,并考虑了IoC设置.我知道你不应该依赖于服务位置模式(无论如何),但是在结构良好的应用程序中只有少数几个地方可能是必要的.在这种情况下,您使用CommonServiceLocator项目,还是不打扰它?

我基本上是在寻找关于CSL是否被使用的反馈,或者它的使用范围.

.net design-patterns common-service-locator

9
推荐指数
1
解决办法
1068
查看次数

使用 CommonServiceLocator 将依赖项注入基类是一个好习惯吗?

目前,当我需要将依赖项注入基类时,我使用以下代码:

public class BaseClass
{
    readonly IService _service;
    public BaseClass(IService service)
    {
        _service = service;
    }
}

public class A : BaseClass
{
    public A(IService service) : base(service)
    {
    }
}

public class B : BaseClass
{
    public B(IService service) : base(service)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我必须在所有子类中编写大量重复代码。为了避免这些重复的代码,我想我可以使用 CommonServiceLocator 将依赖项注入到基类中:

public class BaseClass
{
    readonly IService _service;
    public BaseClass()
    {
        _service = ServiceLocator.Current.GetInstance<IService>();
    }
}

public class A : BaseClass
{
}

public class B : BaseClass
{
}
Run Code Online (Sandbox Code Playgroud)

这似乎要简单得多,但我不确定这是否是一个好习惯。

谢谢

c# dependency-injection ioc-container common-service-locator

3
推荐指数
1
解决办法
651
查看次数