- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近看了Mark Seemann's article关于服务定位器反模式。
作者指出了 ServiceLocator 是反模式的两个主要原因:
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
}
}
现在我们要向类“MyType”添加另一个依赖项
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
// new dependency
var dep2 = Locator.Resolve<IDep2>();
dep2.DoSomething();
}
}
这就是我的误解开始的地方。作者说:
It becomes a lot harder to tell whether you are introducing a breaking change or not. You need to understand the entire application in which the Service Locator is being used, and the compiler is not going to help you.
最佳答案
如果您将模式定义为反模式只是因为在某些情况下它不适合,那么是的,它是一种反模式。但是根据这种推理,所有模式也都是反模式。
相反,我们必须查看模式是否有效,对于服务定位器,有几个用例。但是,让我们从您给出的示例开始。
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
// new dependency
var dep2 = Locator.Resolve<IDep2>();
dep2.DoSomething();
}
}
该类的维护噩梦是隐藏了依赖项。如果您创建并使用该类:
var myType = new MyType();
myType.MyMethod();
如果使用服务位置隐藏它们,您将不了解它具有依赖关系。现在,如果我们改为使用依赖注入(inject):
public class MyType
{
public MyType(IDep1 dep1, IDep2 dep2)
{
}
public void MyMethod()
{
dep1.DoSomething();
// new dependency
dep2.DoSomething();
}
}
您可以直接发现依赖关系,并且在满足它们之前不能使用这些类。
But wait a second, if we were using DI approach, we would introduce adependency with another parameter in constructor (in case ofconstructor injection). And the problem will be still there.
If we mayforget to setup ServiceLocator, then we may forget to add a newmapping in our IoC container and DI approach would have the samerun-time problem.
Also, author mentioned about unit test difficulties. But, won't we have issues with DI approach?
关于design-patterns - ServiceLocator 是反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22795459/
我们正在使用 ExtrasUtilities.bridgeServiceLocator() 通过将应用 ServiceLocator 桥接到 Jersey ServiceLocator,将在一个 Se
我是基于 MVVM 的单元测试应用程序,它使用 prism 并使用模拟来测试 View 模型。我可以通过传递区域管理器和资源管理器的模拟对象来调用我的 viewmodel 类的构造函数,但是当控制进入
使用服务定位器与单例相比有哪些优点和缺点?我读过单例不好,但我想知道 s 服务定位器是否通常是一种更好的做事方式。 最佳答案 这两种方法都不好,因为从类契约中看不出它的依赖项是什么。也就是说, pri
我正在尝试在应用程序构造函数(从 ResourceConfig 继承的东西)中初始化我的 Jersey 应用程序中的一些组件。看起来像这样 public Application(@Context Se
最近看了Mark Seemann's article关于服务定位器反模式。 作者指出了 ServiceLocator 是反模式的两个主要原因: API 使用问题 (我对此非常满意) 当类使用服务定位器
我正在尝试创建一个可重用的组件,该组件从居民文件中定义的服务创建一个ServiceLocator。我需要确定 ServiceLocator 是否还有内置服务之外的服务。如果没有,也许会向用户记录一些警
最近看了Mark Seemann's article关于服务定位器反模式。 作者指出了 ServiceLocator 是反模式的两个主要原因: API 使用问题 (我对此非常满意) 当类使用服务定位器
我正在尝试为单元测试设置服务定位器,如下所示: var mockS = new Mock(); ServiceLocator.SetLocatorProvider(() => mockS.Object
我愿意: 使所有需要它们的类都可以看到通常需要的服务, 使用最少的样板文件,并且 不牺牲可测试性! 这是一个小项目,我认为 DI 可能有点矫枉过正,但也许我错了?反正我一直关注ServiceLocat
我 99% 的依赖是通过 @Autowired Spring 注解使用 DI 模式管理的。 尽管如此,在特定场景中,直到运行时我才能确定要使用哪个实现。 最广为人知的情况,是解析器的多重实现。 第一种
我有一个多模块 GWT 项目,我想使用 ServiceLocators。我有 3 个模块: “客户端”依赖于共享 “共享” “服务器”依赖于共享 我这样写了ServiceLocator: public
我正在对使用统一依赖注入(inject)框架的类进行单元测试。 这将返回 null: ServiceLocator.Current.GetInstance(); 我怎样才能让它返回一个模拟对象或只是对
有人知道 Microsoft.Practices.ServiceLocation 来自哪里吗?这是 MS EnterpriseLibrary 中使用的命名空间和 dll。诚然,这是一个非常简单的 dl
这是我的 previous question 的后续问题. 我正在尝试为我的 ServiceLocator 类编写测试用例,但它给了我以下错误: com/iplanet/ias/admin/commo
我使用了 axis Web 服务客户端向导 + 开发客户端 slider 来生成文件: Mage_Api_Model_Server_HandlerBindingStub Mage_Api_Model_
开始学习后一直在思考一个问题Prism ...为什么我们需要使用 Service locator如果我们有 MEF以满足所有需要的导入。 Common Service Locator link for
我开始使用 Prism 和 MVVM 开发一个 WPF 项目,我正在尝试使用 eventAggregator,但是当执行下面的行时会引发异常: IServiceLocator ob = Service
在我的 App.xaml.cs 中有 private void InitializeContainer() { var catalogs = new AggregateCatalog();
我有一个 J2EE webapp,用于上传文件,然后由数据库过程处理该文件。因为我们不希望 webapp 必须等到数据库过程完成,所以它在不同的线程中执行。 运行在独立线程中的进程需要获取并关闭自己的
我正在使用带有 RequestFactory 的 GWT 2.2。该应用程序有一个现有的服务层(服务器端),所以我使用 ServiceLocator 来提供这些实现。 My Proxy 和 Reque
我是一名优秀的程序员,十分优秀!