gpt4 book ai didi

dependency-injection - 在 Dagger 中使用不带 @Provides 的 @Singleton

转载 作者:行者123 更新时间:2023-12-04 20:44:22 25 4
gpt4 key购买 nike

一个注入(inject)类的模块的小例子Foo :

@Module(complete = false, injects = { Foo.class })
class MyModule { }

class Foo {
@Inject
Foo(Bar bar, Baz baz) { }
}

(假设 BarBaz 由不同的模块提供)

我现在想要 Foo成为单例。

我可以添加 @Provides方法并用 @Singleton 注释它...
@Module(complete = false, injects = { Foo.class })
class MyModule {
@Provides @Singleton Foo provideFoo(Bar bar, Baz baz) {
return new Foo(bar, baz);
}
}

...但是必须自己编写构造函数调用有点违背了使用注入(inject)框架的目的。有没有更短的方法来完成这个?

最佳答案

tl;博士

您可以添加@Singletonclass Foo {}当 Foo 通过隐式绑定(bind)实例化时,它将被绑定(bind)为@Singleton。例如:

@Module(complete = false, injects = { Foo.class })
class MyModule { }

@Singleton
class Foo {
@Inject
Foo(Bar bar, Baz baz) { }
}

范围

这里需要注意的是,如果它在根图中被隐式绑定(bind)但未引用,则扩展图(.plus() 生成的图)可能会无意中实例化它,因此您需要将其声明为入口点(注入(inject)=) (你在你的例子中做了),或者它需要被入口点可以到达的东西所消耗。

如果您不使用 .plus() 进行范围/生命周期管理,那么最后一点并不重要。但是@Singleton 表示每个图一个,并且图的隐式绑定(bind)仅按需实现。即将推出的允许使用自定义范围注释的功能将捕获这些错误。

关于dependency-injection - 在 Dagger 中使用不带 @Provides 的 @Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20690953/

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