在spring4d演示中,使用ServiceLocator.GetService<MyType>('Name')来解析类型。但是为什么不使用GlobalContainer.Resolve<MyType>('Name')呢?我看不出这种方法有什么好处。
发布于 2015-05-01 21:01:43
有一个用例,我使用ServiceLocator:当编码使遗留代码项目可单元测试时……
有一个老项目,在多个地方,有一个对象的构造函数调用,我为其编写测试(新的和更改的方法只在类中,其中注入是不可能的,例如当在按钮事件中创建和销毁窗体时)。
在单元测试中,spring4d有助于实例化被测类:
我可以为生产项目使用dpr中的GlobalContainer和一个特殊的(仅限测试的) TContainer-object,它在Testfixture.Setup中构造,在Testfixture.TearDown中销毁……我还重新初始化了全局服务定位器以使用我的测试容器(原因:我在测试中使用GlobalContainer的经历很糟糕,您不能在Testfixture.TearDown中从GlobalContainer中注销一个类型)。
所以现在,我在dpr中有了一个很大的方法,我在生产代码项目中将所有类型注册到GlobalContainer。在我的test-fixture-class的Setup-Method中,我将测试所需的所有类型注册到我的test -Container。在方法中,我将它们改为可单元测试的,我使用ServiceLocator构造测试中的类,以前使用构造函数调用的地方。
对我来说,这是使这样的遗留代码项目可单元测试的唯一方法……但我的战略目标是有一天替换大部分代码(逐部分替换,包括重新初始化的ServiceLocators)。现在就是不可能替换它(太多的成本,太多的风险...)。
https://stackoverflow.com/questions/29606485
复制相似问题