根据依赖性反转原则,更高级别的模块不依赖于较低级别的模块,而是依赖于抽象。所以这是一种自上而下的方法。我有一个有三层的网络项目。第1层包含视图页面和控制器以及视图模型。第2层是服务层,第3层是存储库。由于Web项目是最高级别的模块,因此它包含应由Service层实现的接口,Service层包含应由存储库实现的接口。所以Service层有Web项目的参考,存储库有服务层的参考。我使用autofac作为IOC容器。由于Service层实现了web项目的接口,我需要在autofac模块的Service层中注册接口,还需要在autofac模块的repository层中注册服务层的接口。据我所知,我需要在应用程序启动时注册autofac模块。如果我想这样做,我需要将服务层的引用提供给Web项目,并将存储库层的引用提供给服务层或Web项目。但如果我想遵循DIP的自上而下的方法,它将创建循环构建依赖。 我的问题是如何注册autofac模块并维护DIP?
编辑1: 问题的标题发生了变化,因为我认为对任何DI容器都是一样的方法
答案 0 :(得分:1)
依赖性反转是指依赖关系图中依赖项的反转。它并不意味着反转程序集之间的依赖关系(或反转对象所在的位置)。
您的服务层接口应该仍然位于服务层程序集中,或者位于其他位置的其他程序集中 - 而不是位于您的UI中。但是,应该反转UI层和服务层之间的依赖关系。
以下是普通依赖关系的样子(箭头指向下方,UI取决于具体对象):
这是Dependency Inversion的样子(箭头反转,UI取决于抽象):
请注意,这里没有关于事物应该在哪里的概念......但希望它能简化你对这个概念的理解。