【问题标题】:Best practice for resolving in Spring4D?在 Spring4D 中解决的最佳实践?
【发布时间】:2015-06-18 19:58:01
【问题描述】:

在 spring4d 演示中,ServiceLocator.GetService<MyType>('Name') 用于解析类型。但是为什么不使用GlobalContainer.Resolve<MyType>('Name')?我认为这种方法没有任何优势...

【问题讨论】:

  • Some 认为service locator 是一种反模式。我会考虑这两种方法的替代品。
  • 由于两者都使用全局变量,它们并不酷,是的。但是您对替代方案有什么建议吗?
  • 我认为您可以确保只使用应用程序的CompositionRoot 中的容器,然后只要对象图完全在组合根(并且容器不在此位置之外引用),则服务定位器在功能上与依赖注入相同。
  • 但是有什么区别呢?当我可以拿容器时为什么要使用服务定位器?
  • 我推荐使用 GlobalContainer.Resolve,完全忽略 ServiceLocator。我还建议在应用程序的组合根中进行调用。在 Delphi 中,这通常在 DPR 文件中。

标签: delphi dependency-injection ioc-container delphi-xe6 spring4d


【解决方案1】:

有一个用例,我使用 ServiceLocator: 在进行编码以使遗留代码项目可单元测试时...

有一个旧项目,在多个地方,有一个对象的构造函数调用,我为它编写测试(仅在类中无法注入的新方法和更改方法,例如,当创建表单时在按钮事件中销毁)。

在单元测试中,spring4d 有助于实例化被测类:

我可以将 dpr 中的 GlobalContainer 用于生产项目,并在 Testfixture.Setup 中构建并在 Testfixture.TearDown 中销毁的特殊(仅测试)TContainer 对象...我还重新初始化全局服务-Locator 使用我的测试容器(原因:我在测试中使用 GlobalContainer 的体验很糟糕,您不能在 Testfixture.TearDown 中从 GlobalContainer 中取消注册类型)。

所以现在,我在 dpr 中获得了一个大方法,我在生产代码项目中将所有类型注册到 GlobalContainer。在我的测试夹具类的设置方法中,我将测试所需的所有类型注册到我的测试容器中。在我更改为使它们可单元测试的方法中,我使用 ServiceLocator 构造了被测类,以前使用的是构造函数调用。

对我来说,这是使此类遗留代码项目可单元测试的唯一方法...但我的战略目标是替换大部分代码(逐个部分,包括重新初始化的 ServiceLocators)一天。现在无法更换它(成本太高,风险太大......)。

【讨论】:

  • 哦,好吧,所以基本上你使用服务定位器的唯一原因是可以更改底层容器 - 听起来很合理
  • 不是唯一的原因... [Inject] 属性是不可能的... 一些对象的生命周期只是在一个方法中... 如何使用 [Inject] 做到这一点?跨度>
猜你喜欢
  • 2012-08-17
  • 2011-04-08
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2012-05-07
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多