Dagger 2 - 减少需要注释的类数量的策略

问题描述 投票:0回答:1

因此,我目前正在学习dagger 2,并且从我到目前为止阅读的教程中,为了注入依赖项,@Inject注释与字段(用于活动/片段)或构造函数一起放置。但是我认为这是一个问题,如果我不是代码部分的所有者,并且无法为此技术添加所需的注释,或者如果我不希望代码的其他部分知道匕首存在。

我目前的应用程序结构是:

  1. 应用程序模块 - 我想在其中放入我的DI代码(例如匕首模块等)。
  2. 演示模块 - 视图/视图模型等
  3. 域模块 - 用例等
  4. 数据模块 - 存储库等

几乎我的应用程序中包含这种类型的类:

  • 演示文稿中的class ExampleViewModelImpl(useCase: ExampleUseCase): ViewModel()(从活动或类似内容初始化)。
  • class ExampleUseCaseImpl(repository: ExampleRepository): ExampleUseCase in Domain
  • class ExampleRepositoryImpl(dao: ExampleDao): ExampleRepository in Data

通过上面的结构,为了尽可能多地使用自动依赖注入来利用匕首,我需要触摸的App模块之外的最小类数是多少?如何实现这一目标的代码示例将非常棒。

我不确定某些术语,并且无法在线找到解决方案。如果有好的资源可以解释我的要求,那也很棒。

android kotlin dagger-2
1个回答
1
投票

如果我不希望代码的其他部分知道匕首存在。

@Inject是Dagger实施的标准(JSR 330)。添加这些注释与Dagger没有任何关系,可以与其他DI框架一样使用。如果这是你的代码,你应该在适当的地方添加那些@Inject注释。将它们视为文档:必须注入哪些构造函数/字段/方法才能创建和使用此对象?

你的课程知道Dagger存在的唯一地方就是你要创建对象的地方。


沿着这条路走下去,当然你可以在没有任何@Inject注释的情况下使用Dagger,但是你会编写很多不必要的样板并且同时错过Dagger最强大的功能(代码生成)。

@Inject注释与字段(用于活动/片段)或构造函数内联。但是,如果我不是代码部分的所有者并且无法为此技术添加所需的注释,我认为这是一个问题

这就是@BindsInstance@Component.Builder的用途(向组件添加对象)以及@Provides注释方法的用途(从模块创建和初始化对象)

如果你真的想在没有@Inject的情况下编写代码,那么你就可以为所有对象做到这一点。这意味着很多模块,甚至更多的@Provides注释方法。它会起作用,但如果构造函数上的单个@Inject具有相同的效果,我就没有看到编写所有这些方法的重点。 在我看来,关于Dagger的最好的事情是我可以添加/删除/更改构造函数参数,而不必触及我的代码的任何其他部分,因为Dagger将使用新参数生成新代码。在您的情况下,您还必须将参数更改为@Provides方法以及构造函数调用。

接下来让我们看看如何从字段中删除@Inject。基本上你不想进行字段注入,所以不要在组件中编写注入方法,而是编写提供方法。

@Component
class MyComponent {

  fun inject(activity: MyActivity)

}

class MyActivity {
  @Inject lateinit var myDep: Dependency

  fun onCreate() {
    component.inject(this)
  }
}

删除@Inject我们需要使用提供方法。

@Component
class MyComponent {

  fun provisionMyDependency() : Dependency

}

class MyActivity {
  lateinit var myDep: Dependency

  fun onCreate() {
    myDep = component.provisionMyDependency()
  }
}

它会工作和一切,但同样,你会错过Dagger的唯一最佳功能:代码生成。上面的例子看起来没问题,因为我只添加了一个依赖项,但想想当你添加/删除/更改依赖项时,这两个不同的实现会发生什么,它的扩展程度如何。如果你喜欢手动做任何事情,任何重构都会变得艰难。

通过上面的结构,为了尽可能多地使用自动依赖注入来利用匕首,我需要触摸的App模块之外的最小类数是多少?

您的问题(尤其是标题)与您的目标直接冲突。如果您不想使用这些注释,那么您不能使用Dagger代码生成和注入,但必须手动执行此操作,如上所示。

尽可能多地使用自动依赖注入

为了最好地利用Dagger,你可以在每个类的构造函数和/或字段上添加@Inject,这些类应该最终出现在依赖图上,让Dagger做它的事情。

© www.soinside.com 2019 - 2024. All rights reserved.