因此,我目前正在学习dagger 2,并且从我到目前为止阅读的教程中,为了注入依赖项,@Inject
注释与字段(用于活动/片段)或构造函数一起放置。但是我认为这是一个问题,如果我不是代码部分的所有者,并且无法为此技术添加所需的注释,或者如果我不希望代码的其他部分知道匕首存在。
我目前的应用程序结构是:
几乎我的应用程序中包含这种类型的类:
class ExampleViewModelImpl(useCase: ExampleUseCase): ViewModel()
(从活动或类似内容初始化)。class ExampleUseCaseImpl(repository: ExampleRepository): ExampleUseCase
in Domainclass ExampleRepositoryImpl(dao: ExampleDao): ExampleRepository
in Data通过上面的结构,为了尽可能多地使用自动依赖注入来利用匕首,我需要触摸的App模块之外的最小类数是多少?如何实现这一目标的代码示例将非常棒。
我不确定某些术语,并且无法在线找到解决方案。如果有好的资源可以解释我的要求,那也很棒。
如果我不希望代码的其他部分知道匕首存在。
@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做它的事情。