匕首2是基础(第1部分)

目录内容

  1. 引言
  2. 什么是依赖注入,依赖示例
  3. 匕首2-简介
  4. 首次使用Dagger 2

引言


本文不是由高级程序员使用相同,普通和易于理解的词写的。
本文使用Kotlin示例代码。 Dagger版本2.17。 可以在文章末尾下载示例。

什么是依赖注入?


依赖注入(注入或依赖注入)是一类对另一类的依赖。 即 对于一个类的完整操作,需要初始化另一个(他们的)类。

例如,如果没有引擎类,那么汽车类(汽车)就无法工作,而如果没有燃料类,那么汽车类将无法工作。 看起来像这样:

class Car(private var engine: Engine) class Engine ( private var fuel: Fuel) class Fuel(){ private val fuel = if(BuildConfig.DEBUG){ “benzine” } else { “diesel” } } 

在此示例中,Car类取决于Engine类,而后者又取决于Fuel类。

匕首2-简介


Dagger是一个有助于实现依赖项注入的库:。 这是一个谷歌图书馆。 详细文档可在此处获得

匕首的优点:

  • 我必须写更少的样板代码。
  • 帮助结构依赖性。
  • 当有很多依赖项时,它极大地简化了工作
  • 代码变得易于阅读。

匕首的缺点:

  • 缺少详细的文档
  • Dagger使用注释尝试了解开发人员的意图。 当他不正确地理解你时,事情变得复杂
  • 匕首生成的代码很难发现

首次使用Dagger 2


首先,您需要在应用程序中添加匕首。 我知道2种方法
1.打开build.gradle(App)并添加跟踪。

1.1在插件声明部分的顶部

 apply plugin: 'kotlin-kapt' 

依赖项中的1.2

 { ... kapt "com.google.dagger:dagger-compiler:$dagger_version" implementation "com.google.dagger:dagger:$dagger_version" } 

我在本节中指定了匕首(dagger_version)的版本

 ext { dagger_version = '2.17' } 

如果不是这种情况,则需要在android部分上方添加该部分。

2.通过项目结构添加Maven存储库-依赖关系-添加库依赖关系

同步项目后,我们准备使用匕首实现依赖项。

首先,创建Car,Engine和Fuel类:

 class Car constructor(private var engine: Engine) class Engine constructor(private var fuel: Fuel) class Fuel { private val fuelType = if(BuildConfig.DEBUG){ "benzine" }else{ "diesel" } } 

在Car,Engine和Fuel类的构造函数之前,我们添加了dagger Inject批注,从而使dagger理解在必要时应实现这些类。 我们得到了踪影。

 class Car @Inject constructor(private var engine: Engine) class Engine @Inject constructor(private var fuel: Fuel) class Fuel @Inject constructor() { private val fuelType = if(BuildConfig.DEBUG){ "benzine" }else{ "diesel" } } 

Dagger需要知道如何创建它需要实现的所有对象。 为了列出我们实现的所有类(Inject),使用了Component注释,该注释是为接口(DaggerComponent)声明的。

看起来像这样:

 @Component interface DaggerComponent { fun getCar(): Car fun getEngine(): Engine fun getFuel(): Fuel } 

声明组件方法时,重要的不是方法名称,而是它们返回的类。

在这一步,您需要构建一个项目(Build-Rebuild project)。 之后,匕首将生成必要的类和工厂以初始化组件。 工厂的名称将与我们在其中初始化匕首类的接口的名称一致,不同之处在于将添加前缀“ Dagger”,即 在输出中,我们获得DaggerDaggerComponent类。

 // Generated by Dagger (https://google.imtqy.com/dagger). package com.example.dagger2; public final class DaggerDaggerComponent implements DaggerComponent { private DaggerDaggerComponent(Builder builder) {} public static Builder builder() { return new Builder(); } public static DaggerComponent create() { return new Builder().build(); } @Override public Car getCar() { return new Car(getEngine()); } @Override public Engine getEngine() { return new Engine(new Fuel()); } @Override public Fuel getFuel() { return new Fuel(); } public static final class Builder { private Builder() {} public DaggerComponent build() { return new DaggerDaggerComponent(this); } } } 

一切准备就绪。 让我们尝试在MainActivity中创建Car类型的car字段:

 private var car: Car = DaggerDaggerComponent.create().getCar() 

通过启动应用程序,可以确保在访问汽车场时已对其进行了初始化。

源代码

Source: https://habr.com/ru/post/zh-CN466725/


All Articles