我一直在寻找Common Service Locator作为抽象我的IoC容器的方法,但我注意到有些人强烈反对这种类型.
人们建议永远不要使用它吗?一直在使用它?或者有时使用它?如果有时候,那么在什么情况下你会使用它以及你不会使用它的情况.
c# dependency-injection inversion-of-control common-service-locator service-locator
Ninject 2的变化说Ninject支持Common Service Locator,但我该如何使用它?我找不到任何手册或样本.
dependency-injection ninject inversion-of-control common-service-locator ninject-2
是否有方法签名的意图的差异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
.还不清楚是否缺乏所要求的服务类型的实施应构成例外.
如果没有为服务类型的实现会导致ActivationException
在IServiceLocator
实现? 看起来不像.用于忽略非空后置条件的任何概念的实现模板IServiceLocator
.
该实施模板为IServiceLocator
也把IServiceProvider.GetService(Type)
作为替代语法IServiceLocator.GetInstance()
.这是否违反Liskov(由于在基类型上未声明的子类型中抛出异常),或者,实际上是否需要在实现中有所不同,而不是在接口的方法签名上声明的异常?我得到的是:我们确定实现的ServiceLocatorImplBase
实现模板IServiceLocator
都正确接口吗? …
c# dependency-injection common-service-locator service-locator base-class-library
我现在正在开发一个新项目,并考虑了IoC设置.我知道你不应该依赖于服务位置模式(无论如何),但是在结构良好的应用程序中只有少数几个地方可能是必要的.在这种情况下,您使用CommonServiceLocator项目,还是不打扰它?
我基本上是在寻找关于CSL是否被使用的反馈,或者它的使用范围.
目前,当我需要将依赖项注入基类时,我使用以下代码:
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