9

在依赖注入中,我们针对抽象进行编程。

根据我的经验,我可以说应用程序中的大多数抽象与其实现具有 1:1 的关系。这违反了重用抽象原则

Mark Seeman 在他的一些帖子中建议我们可以为抽象使用 Null 对象实现以避免违反RAP(Mark Seeman 的这个建议可能是我的推论。如果我在此引用 Mark 的错误,请纠正我)。我的问题是。

  1. 如何做空对象实现?
  2. 可以违反 RAP 吗?
4

1 回答 1

16

就我个人而言,即使只有一个生产实现,我也发现对抽象进行编程很有。尤其是:

  • 即使你只有一个生产实现,你也可能在测试中有其他实现,要么是成熟的假货,要么是动态创建的 mocks
  • 在许多情况下,它比依赖于具体类更清楚地表达了依赖关系。例如,由于各种原因,具体类可能会公开一些您依赖的其他公共成员。

请注意,这是一个错误的陈述:

在依赖注入中,我们针对抽象进行编程。

您可以非常轻松地将依赖注入与具体类一起使用。没有什么可以说你必须为你的依赖创建接口。依赖注入更多的是关于你的类如何获得它的依赖,而不是关于它使用什么抽象级别来表达它们。

所以基本上:

  • 不要低估“测试替身”对实现抽象的重要性,即使你只有一个生产实现
  • 如果你真的想要,不要害怕依赖具体的实现,但是注入这个依赖仍然比在你的类中创建它更干净,它确实是一个“正确”的依赖
  • 不要尝试注入所有内容- 如果依赖项的行为不是真正的交互,那么您可能不想注入它。例如,不要仅仅为了避免创建实例而开始注入“集合提供程序” List<T>——例如,您不需要将您的类与List<T>用于测试目的的行为隔离开来。
于 2012-06-05T09:28:54.473 回答