gpt4 book ai didi

dependency-injection - 我可以覆盖 Dagger 中的绑定(bind)吗?

转载 作者:行者123 更新时间:2023-12-04 08:22:09 24 4
gpt4 key购买 nike

如果我有一个类的默认实现,并且它确实定义了@Inject 构造函数,那就太好了。系统将其拾取。

如果一个应用程序想要用一个子类覆盖默认的 impl,我可以在它的模块中定义一个 @Provides 并在我自己的代码中对该子类调用“new”,而 dagger 会使用那个 impl(据我所知到目前为止,这是有效的)。

但是,如果我想让 dagger 实例化那个子类,有没有办法在不在 @Module 中声明“override=true”的情况下做到这一点?我喜欢没有 override=true 这样在构建时所有的重复检查都会给我适当的警告。

当然,一种方法是强制所有应用程序直接声明@Provides。这只会增加膨胀。

我以前使用过 GIN(GWT 的 Guice),您可以通过 .class 引用定义到您想要的类的绑定(bind),但我在 dagger 中没有看到任何类似的东西。

最佳答案

现在,如果不使用“overrides”属性(它的目的更多是为了测试而不是这个),没有办法拥有可以自由覆盖的“默认绑定(bind)”。我们正在考虑如何进行默认绑定(bind)。

您可以考虑使用集合绑定(bind)来执行此操作,方法如下:

@Module(...)
class MyModule {
@Qualifier @interface OverridableFoo { }

@Provides(type=SET_VALUES) @OverridableFoo Set<Foo> provideOverriddenFoo() {
return new HashSet<Foo>(); // Empty set to ensure the Set is initialized.
}

@Provides Foo provideFoo(@OverridableFoo Set<Foo> Foo overriddenFoo) {
switch (overriddenFoo.size()) {
case 0: return new DefaultFooImpl();
case 1: return overriddenFoo.iterator().next();
default: throw new IllegalStateException("More than one overridden Foo Provided.");
}
}
}

然后,当您想要覆盖时,只需包含以下内容:

@Module(...)
class MyModule {
@Provides(type=SET_VALUE) @OverridableFoo Foo provideBetterFoo() {
return new MyAwesomeFoo();
}
}

这不是一个好方法,因为它将应该是编译时错误的东西移到运行时,但作为我们尝试决定如何处理默认绑定(bind)的权宜之计,我认为它是可行的.

关于dependency-injection - 我可以覆盖 Dagger 中的绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155515/

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