依赖倒置和普遍依赖

Tom*_*don 5 c++ dependency-injection inversion-of-control

我试图获得依赖倒置,或者至少理解如何应用它,但我现在遇到的问题是如何处理普遍存在的依赖关系.典型的例子是跟踪日志记录,但在我的应用程序中,我有许多服务,如果不是所有代码都依赖于(跟踪日志记录,字符串操作,用户消息日志记录等).

对此的解决方案似乎都不是特别令人满意的:

  • 使用构造函数依赖注入意味着大多数构造函数将具有多个标准注入依赖项,因为大多数类明确需要这些依赖项(它们不仅仅将它们传递给它们构造的对象).
  • 服务定位器模式只是将依赖项驱动到地下,将它们从构造函数中移除,但将它们隐藏起来,以便它甚至不能明确表示依赖项是必需的
  • 单身人士服务也是单身人士,也可以隐藏依赖关系
  • 将所有这些公共服务集中到一个CommonServices接口并注入a)违反了Demeter法则和b)实际上只是服务定位器的另一个名称,虽然是特定的而不是通用的.

有没有人对如何构建这些依赖关系,或者任何上述解决方案的任何经验有任何其他建议?

请注意,我没有考虑特定的DI框架,事实上我们正在使用C++进行编程,并且会手动执行任何注入(如果确实注入了依赖项).

Ste*_*ven 2

服务定位器模式只是将依赖项驱动到地下,单例服务就是单例,并且还用于隐藏依赖项

这是一个很好的观察。隐藏依赖项并不会删除它们。相反,您应该解决类所需的依赖项的数量。

使用构造函数依赖注入意味着大多数构造函数将具有多个标准注入依赖项,因为大多数类明确需要这些依赖项

如果是这种情况,您可能违反了单一责任原则。换句话说,这些类可能太大并且做的事情太多。既然您正在谈论日志记录和跟踪,您应该问问自己是否没有记录太多。但一般来说,日志记录和跟踪是跨领域的关注点,您不必将它们添加到系统中的许多类中。如果您正确应用SOLID原则,这个问题就会消失(如此处所述