Android世界中的DIP,IoC和DI

最近,我在一次采访中被问到:“依赖注入和SOLID的依赖倒置原则之间有什么区别”。我知道它们每个的定义,但是我无法在这些概念之间划清界限。在本文中,我想以纯架构和Android框架为例,简要描述依赖关系反转原理(DIP),控制反转(IoC)和依赖关系注入(DI)的概念之间的区别。所以走吧



依赖倒置原则



定义

答:高级模块不应依赖于低级模块。两种模块都必须依赖抽象。

B.抽象不应依赖细节。详细信息应取决于抽象。


第一个定义包括“模块”的概念。这是一个非常重要的概念,没有它,DIP就无法理解。



模块-逻辑上互连的功能元素集



为避免误解,请以示例形式考虑定义。假设我们需要获取已阅读书籍的列表并将其显示给用户。为此,我们将使用BooksInteractor和BooksRepository类。我们将这些类分别放在模块BI和BR中。BooksInteractor类模块取决于BooksRepository类。







BooksInteractor'y需要从BooksRepository获取书籍列表。 Interactor完全不在乎存储库如何接收此数据,这意味着在这种情况下BooksInteractor是BooksRepository的抽象。根据第二个定义,BooksInteractor(抽象)不应该依赖BooksRepository(实现)。另一方面,存储库必须了解BI模块。那么会发生什么:交互器必须在存储库中?不,要反转依赖关系,我们只需要用IBooksRepository接口覆盖BooksRepository,然后将此接口放入BooksInteractor类的模块即可。现在让我们回到DIP的第一个定义,并看一下该图。







看,上级模块(BI模块)不依赖于下级模块(BR模块)。并且这两个模块都依赖于抽象(来自IBooksRepository接口)。如果您通过使用接口覆盖存储库而抓住了依赖倒置的魔力,那么您将了解依赖倒置的原理。恭喜你!您最难理解的部分。您可以在Habré上的这篇文章中了解有关DIP的更多信息



控制反转



我们研究了“依赖倒置原则”的概念。现在,让我们继续进行另一个反转-控制反转。这个概念本身非常广泛,在编程中可能意味着三件事之一:



  1. 接口反转-将模块之间的关系委托给中间接口。它在哪里适用?例如,在我们之前研究的DIP中。
  2. — (, DI/IOC ).
  3. — , . , , — Android . Activity Fragment, .


Dependency Injection



依赖注入是一种将其依赖传递给类的机制。当您需要将依赖项传递给另一个类时,总是会遇到这种情况。注入依赖项有几种方法:通过构造函数(构造函数注入),方法(方法注入)和属性(属性注入)。这些方法中的每一种都用于其自己的目的。但是在这里重要的是要了解,依赖注入只是将依赖传递给构造函数,方法或属性。



考虑边缘情况



  • 没有IoC和DIP的DI会存在吗?也许吧。我们创建一个具体的类A的实例,并通过构造函数,方法或属性将其传递给类B的对象。
  • 如果没有IoC,会有DIP吗?不,DIP是在IoC中实现接口倒置的一种方法。
  • 没有DI可以有DIP吗?是的,我们可以将下部模块绑定到接口。上层模块类将与接口抽象一起工作,但是下层模块类的具体实现将在上层模块的构造函数中创建。


您可以在此处此处找到其他作者的DIP,DI和IoC之间的区别



我很高兴收到您的评论和反馈!



All Articles