我正在尝试重构我的代码以使用Common Service Locator。我有一个共享库,供其他一些组件使用。
我不明白的是:这些组件是否应该调用ServiceLocator.Current并解析它们的类型?在这种情况下,我如何确保ServiceLocator.Current实际设置?我应该创建自己的“MyServiceLocator”并添加静态构造函数吗? (这似乎打败了标准化抽象的目的)
或者我的共享库是否应该有一个类将所有可解析的类型公开为公共属性,从而使ServiceLocator完全保留在共享库的内部? (这意味着在抽象之上的抽象之上有一个抽象)?
问题是组件不是通过DI创建的,而是应该调用Container来获取他们需要的东西。
答案 0 :(得分:3)
你shouldn't be using a Service Locator at all。相反,通过允许您(或任何DI容器)向其中注入适当的依赖项,确保依赖项的所有使用者都打开以实现可扩展性。 构造函数注入通常是最佳选择。
Krzysztof Kozmic最近发表了对how a DI Container should be used的一个很好的概述。他的例子使用Castle Windsor,但你可以推断到任何DI容器,以及Common Service Locator。但是,如果您遵循这些原则,公共服务定位器就会变得多余。