在Spring4D中解决的最佳实践?

时间:2015-04-13 13:26:14

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

我可以在dpr中使用GlobalContainer用于生产项目,并使用一个特殊的(仅测试)TContainer对象,该对象在Testfixture.Setup中构建并在Testfixture.TearDown中销毁...我还重新初始化全局服务-Locator使用我的Test-Container(原因:我在Test中使用GlobalContainer有不好的经验,你不能在Testfixture.TearDown中从GlobalContainer取消注册一个类型)。

所以现在,我在dpr中得到了一个很大的方法,我在生产代码项目中将所有类型注册到GlobalContainer。在我的test-fixture-class的Setup-Method中,我将测试所需的所有类型注册到我的Testing-Container。在方法中,我改为使它们可单元测试,我使用ServiceLocator构建了测试中的类,以前使用构造函数调用。

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