依赖倒置原则——接口应该去哪里?

Dependency Inversion Principle - Where should the interfaces go?

几个月来我一直在为这个问题摸不着头脑,但我仍然能够令人满意地说服自己我有正确的答案。我们有一个非常典型的情况,我们在应用程序的多个层之间存在依赖关系,其中每一层都在其自己的程序集中。例如,我们的应用程序层使用存储库层来检索非常标准的数据。我的问题是,抽象(在本例中为接口)将存在于何处,为什么?在给出的示例中,它应该进入应用程序层还是存储库层或单独的抽象程序集?

根据The Clean Architecture description中的图表和描述(不是我们特别遵守的内容),我将它们放在应用程序层中,以便所有依赖项都指向内部,但我不确定如果这是对的。我已经阅读了很多其他文章并查看了无数示例,但是关于抽象应该存在的推理方式很少。

我看过 this question,但我不认为它能回答我的问题,除非实际答案当然是无关紧要的。

之所以称为依赖倒置原则,是因为从高层模块到低层模块的经典依赖方向倒置如下:

| HigherLevelClass -> RequiredInterface | <= LowerLevelClassImplementingTheInterface |

因此反向依赖是从较低级别的模块指向更高级别模块的必需 抽象。 由于客户端模块(您的应用程序层)需要 某个较低级别的功能,因此相关的抽象(您的存储库接口)放置在客户端模块附近。

我所知道的所有描述都使用包结构来解释这一点。 但是,我看不出为什么模块或层不应该如此。

有关详细信息,例如参见:http://en.wikipedia.org/wiki/Dependency_inversion_principle