假设我有一个 BaseForm
这取决于 ILogger
或 IResourceManager
或类似的东西。目前,它使用服务定位器解决了所需服务的正确实现,我知道这是一种反模式。
BaseForm
吗? (及其'派生类型)在容器中,以便创建具有已解决依赖关系的实例?这不是把一切都复杂化了吗? 很抱歉一次问了很多问题。我已经阅读了以下 SO 问题和许多其他问题,但阅读它们只会增加我的困惑:
最佳答案
如果可能的话,你应该总是使用依赖注入(inject),因为它有一些明显的优势。然而,对于 UI 技术,并不总是可以使用依赖注入(inject),因为某些 UI 技术(例如,在 .NET 空间中,Win Forms 和 Web Forms)只允许您的 UI 类(表单、页面、控件等)具有默认构造函数。在这种情况下,您将不得不退回到其他东西,即服务定位器。
在这种情况下,我可以给你以下建议:
除了单元测试之外,还有另外两个反对使用服务定位器的重要论据,这是 Mark Seemann 在他著名的博客文章 Service Locator is an Anti-Pattern 中给出的。 :
关于dependency-injection - 对使用 IOC 容器、服务定位器和工厂感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269293/