避免违反重用抽象原则

Raj*_*san 9 .net dependency-injection

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

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

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

  1. 如何实现Null Object?
  2. 是否可以违反RAP?

Jon*_*eet 16

我个人觉得这有用的程序提供给抽象即使只有一个生产实施.特别是:

  • 即使您只有一个生产实现,您也可以在测试中使用其他实现,无论是完整的假动作还是动态创建的模拟
  • 在很多情况下,依赖于具体类,它更依赖于依赖关系.例如,由于各种原因,具体类可能会暴露您依赖的其他一些公共成员.

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

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

您可以非常轻松地使用依赖注入和具体类.没有什么可说的,您必须为依赖项创建接口.依赖注入更多地是关于类如何获取其依赖关系而不是它用于表达它们的抽象级别.

所以基本上:

  • 即使您只有一个生产实现,也不要低估"测试双打"实现抽象的重要性
  • 如果你真的想要,不要害怕依赖于具体的实现,但注入依赖性仍然比在类中创建它更清晰,它真正是一个"适当的"依赖
  • 不要试图注入所有东西 - 如果依赖的行为不是真正的交互,那么你可能不想注入它.例如,不要开始注入"集合提供程序"只是为了避免创建实例List<T>- 例如,您不需要将类与List<T>出于测试目的的行为隔离开来.

  • 测试!测试是98%的时间让我从课堂上抽象出来的东西.模拟/假人确保总有至少两个"实现".尽管如此仍然感觉很奇怪.我不明白你关于"互动"的最后一点......什么是互动,什么不互动? (2认同)