为什么要在 Android 中使用像 Dagger 这样的依赖注入框架?
在我们的项目中,我们可能使用也可能没有使用依赖框架。在这篇博客中,我们将讨论为什么我们需要一个依赖框架以及为什么在我们的项目中使用它是有益的。在这种情况下,我们可以假设这是一个面试问题。在这篇 Geeks for Geeks 文章中,我们将通过讨论以下主题来回应它:
- 为什么我们在Android中使用依赖注入框架,比如Dagger?
- 我们如何给框架我们的配置?
- 结论
Note: This blog is not about learning Dagger or any dependency injection framework; however, it will help you understand how it can be useful for Android projects and you will be able to persuade anyone to use a Dependency Injection Framework based on the requirement.
为什么我们在Android中使用依赖注入框架,比如Dagger?
考虑到当我们必须在项目中创建大量依赖于大量其他对象的对象时,随着项目变得越来越大,这变得很困难。随着代码库的增长,我们可能需要一些良好的外部支持来跟踪所有内容。这是我们使用依赖框架的场景之一。其他用例将在本博客后面介绍。让我们看一个例子来更好地理解这个用例。考虑以下场景:我们有两个活动,活动 A 和活动 B。两者都需要对象 Downloader,而对象 Downloader 又需要请求。该请求现在将依赖于 Executor 和 HTTPClient。
在这种情况下,我们首先创建一个Executor和HttpClient的对象,并将其传递给request对象,如下图。
Kotlin
val somePostExec = postExec()
val somePostClient = httpClient()
val somePostReq = postReq(postExec, httpClient)
Kotlin
val myDownloader = Downloader(somePostReq)
Kotlin
val myDownloader = GeeksDownloader.create()
Kotlin
object GeeksDownloader{
fun create():Downloader{
val someExec = someExecutor()
val someClient = someClient()
val someRequest = someRequest(executor, client)
return Downloader(someRequest)
}
}
然后发送的这个请求通过如下方式传递:
科特林
val myDownloader = Downloader(somePostReq)
这就是我们制作 Downloader 对象的方法。考虑到我们将在两个活动(A 和 B)中使用它,所以我们需要一次又一次地编写所有四行。为避免重写此代码,我们可以创建一个工厂类并使用以下命令创建下载器:
科特林
val myDownloader = GeeksDownloader.create()
GeeksDownloader 在哪里:
科特林
object GeeksDownloader{
fun create():Downloader{
val someExec = someExecutor()
val someClient = someClient()
val someRequest = someRequest(executor, client)
return Downloader(someRequest)
}
}
依赖注入基于控制反转的概念,该概念指出类的依赖项应该来自外部。换句话说,任何类都不应该实例化另一个类;相反,应该从配置类中获取实例。考虑一下如果我们简单地给一些框架一些配置会发生什么,例如创建对象的方式,范围(生命周期),并且该框架会为我们创建这些类型的工厂类。我们的任务会被简化。我们只需要编写一些代码将配置传递给框架,框架就会为我们生成工厂类。这就是我们应该做的。
一个场景
考虑以下场景:我们正在家里举办生日派对,需要一个蛋糕。因此,我们自己制作蛋糕需要大量的努力和精确度。我们可以简单地向面包店下订单,面包店将充当框架,接受我们的指示并将蛋糕交付给我们。在这种情况下,我们是消费者。现在让我们看看如何将配置传递给框架。
我们如何给框架我们的配置?
使用框架可以减少我们编写的代码量。所以,一般来说,我们给框架配置比如如何创建对象,对象的作用域(生命周期),这样框架就可以为我们创建依赖,然后消费者可以根据我们提供的配置获取依赖。
现在,以 Dagger 框架为例。
Dagger 是基于注解处理的,它为我们生成代码。 Dagger 只需要我们通过创建一些类和接口以及使用注解来提供的配置。 @Module-注解的类负责提供可以注入的对象。这些类定义了使用@Provides 注释的方法。这些方法返回的对象可用于依赖注入。 @Inject注释用于指定消费者中的依赖项。
当一个接口被@Component注解时, Dagger使用它来生成相应的组件类,它充当模块(对象的提供者)和消费者之间的桥梁,以提供所需的依赖关系。它从模块类中获得必要的依赖。创建具有应用程序范围(应用程序生命周期)或活动范围(活动生命周期)的对象也变得简单。该框架还有许多其他方式可以帮助我们。 Dagger 只需要我们提供所需依赖项的配置,其余的则通过使用我们提供的注解在内部生成代码来处理。
结论
我们应该使用依赖框架,原因如下:
- 它有助于管理复杂的依赖关系。
- 它通过允许我们传递所有外部依赖项来简化单元测试,以便我们可以轻松地使用模拟对象。
- 它可以轻松管理对象的范围(生命周期)。
- 这就是为什么我们需要在Android中使用依赖注入框架,比如Dagger。