首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么它没有@ injection用于依赖注入?

为什么它没有@ injection用于依赖注入?
EN

Stack Overflow用户
提问于 2022-04-25 13:06:58
回答 2查看 266关注 0票数 0

我正在读一些代码,很难理解。

代码语言:javascript
复制
import dagger.Component
import dagger.Module
import dagger.Provides
import javax.inject.Inject


class Sound(val noise: String)

class Dog @Inject constructor(val sound: Sound)

@Module
class DogModule() {
    @Provides
    fun provideWoWo(): Sound = Sound("wowo")

    @Provides
    fun provideDog(sound : Sound): Dog = Dog(sound)
}

@Component(modules = [ DogModule::class ])
interface AnimalComponent {
    val dog: Dog
}

fun main() {
    val component = DaggerAnimalComponent.create()
    println("The dog has sound ${component.dog.sound.noise}.")
}

为什么class Sound(val noise: String)没有@Inject

我以为是class Sound @Inject constructor(val noise: String)

因为Sound类实例也是通过匕首创建的,就像Dog类实例一样

EN

回答 2

Stack Overflow用户

发布于 2022-04-25 13:15:09

因为您使用构造函数参数显式地设置了@Provides@Inject用来省略@Provides。在您的代码中,@Inject on Dog也可以被删除。

总之,如果要用@Inject创建这个类,就不必添加@Provides

票数 0
EN

Stack Overflow用户

发布于 2022-04-26 20:41:34

,因为声音类实例也是通过匕首创建的,就像Dog类实例一样

这是不正确的:DogSound都不是通过Dagger创建的。Dagger允许注入DogSound,但是在模块中您要在您定义的@Provides方法/函数中创建实例。

这也意味着当前忽略了DogSoundSound注释,因为Dagger不是这些对象构造的一部分。相反,您自己提供了这些:@Provides方法和函数可以接收图形中的对象,Dagger将提供这些对象,这就是作为@Provides Dog方法的一部分来接收@Provides Dog的方式。因此,如果Dog的构造函数参数列表发生变化,则需要自己更改@Provides方法。Dagger也不会自动填充在文档中标记为“方法注入”和“字段注入”的@Inject-annotated方法和字段。

如果要删除用于@ProvidesDog方法,则Dagger将读取参数列表本身,并在其更改时自动做出反应。方法和字段注入也将自动工作。

因此,除非您想重写或自定义传递给构造函数的参数,否则永远不需要在带有@Provides构造函数的类上使用@Inject。我建议在可能的情况下使用@Inject,并且只为您无法控制的代码或其他特殊情况保留@Provides。见我的另一个,所以在这里回答:Android Dagger 2: Inject versus Provides

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72000059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档