gpt4 book ai didi

dagger-2 - Dagger 2 依赖项可以是不可注入(inject)的吗?

转载 作者:行者123 更新时间:2023-12-01 03:29:07 25 4
gpt4 key购买 nike

有没有办法告诉 Dagger 2 如何提供一些东西,但不允许它被注入(inject)?

假设我要注入(inject)一个 Qux .一个 Qux需要 FooBar :

@Provides
@Singleton
Foo foo() {
return new Foo();
}

@Provides
@Singleton
Bar bar() {
return new Bar();
}

@Provides
@Singleton
Qux qux(final Foo foo, final Bar bar) {
return new Qux(foo, bar);
}

但是如果我不想 FooBar可以注入(inject)吗?也许暴露它们会破坏 Qux 的封装。 , 或者他们是某种我只想要 Qux 的工厂有权访问。

我想到了几种方法可以实现这一目标:
  • 如果 Foo其他提供者需要单例,我可以将其设为类成员。但是如果 Foo有几个自己的依赖项。
  • 如果 Bar任何其他提供者都不需要单例,我可以在 Qux 中创建实例提供者。但是如果 Qux有几个这样的依赖项。

  • 这些解决方案看起来都不是非常优雅或危险。还有其他方法吗?

    最佳答案

    实现您想要做的最简单的方法是定义一个包私有(private)限定符。

    package my.pkg;

    @Qualifier
    @Retention(RUNTIME)
    @interface ForMyPackage {}

    然后,将其用于 Foo 和 Bar 的绑定(bind):
    @Provides
    @Singleton
    @ForMyPackage
    Foo foo() {
    return new Foo();
    }

    @Provides
    @Singleton
    @ForMyPackage
    Bar bar() {
    return new Bar();
    }

    @Provides
    @Singleton
    Qux qux(final @ForMyPackage Foo foo, final @ForMyPackage Bar bar) {
    return new Qux(foo, bar);
    }

    这样,如果您有权访问限定符,您只能请求注入(inject)这些版本的 Foo 和 Bar。

    如果所有这些绑定(bind)都在一个模块中,您甚至可以在模块中使用私有(private)的嵌套限定符。

    提问者编辑:

    我尝试了最后一个建议。
    @Qualifier
    @Retention(RUNTIME)
    private @interface NoInject {}

    @Provides
    @Singleton
    @NoInject
    Foo foo() { return new Foo(); }

    尝试注入(inject) Foo根据需要导致编译时错误:

    Error:(15, 6) Gradle: error: com.mydomain.myapp.Foo cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. com.mydomain.myapp.MyActivity.foo [injected field of type: com.mydomain.myapp.Foo foo]



    因此,虽然错误消息有点误导,但这种技术是简洁有效的。

    关于dagger-2 - Dagger 2 依赖项可以是不可注入(inject)的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219257/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com