Dependency injection 我可以在匕首中覆盖绑定吗?

Dependency injection 我可以在匕首中覆盖绑定吗?,dependency-injection,dagger,Dependency Injection,Dagger,如果我有一个类的默认impl,并且它确实定义了@Inject构造函数,那就太好了。系统会将其拾取 如果一个应用想用一个子类覆盖默认的impl,我可以在它的模块中定义一个@Provides,并在我自己的代码中对该子类调用“new”,dagger则使用该impl(据我目前所知,这是可行的) 然而,如果我希望dagger实例化该子类,那么有没有一种方法可以不用在@Module中声明“override=true”就可以实现呢?我喜欢不使用override=true,这样在构建时所有重复检查都会给我适当的

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

如果一个应用想用一个子类覆盖默认的impl,我可以在它的模块中定义一个@Provides,并在我自己的代码中对该子类调用“new”,dagger则使用该impl(据我目前所知,这是可行的)

然而,如果我希望dagger实例化该子类,那么有没有一种方法可以不用在@Module中声明“override=true”就可以实现呢?我喜欢不使用override=true,这样在构建时所有重复检查都会给我适当的警告

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


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

现在,如果不使用“overrides”属性,您无法拥有可以自由覆盖的“default binding”(该属性主要用于测试)我们正在考虑如何进行默认绑定

您可以考虑使用SET绑定来做到这一点,比如沿着这些线条:

@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();
  }
}