0

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

4

1 回答 1

1

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

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

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

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

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

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

于 2015-05-01T13:01:43.300 回答