3

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

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

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

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

我之前使用过 GIN(GWT 的 Guice),您可以通过 .class 引用定义与所需类的绑定,但我在 dagger 中看不到任何类似的东西。

4

1 回答 1

3

现在,没有办法拥有一个可以自由覆盖的“默认绑定”,而无需使用“overrides”属性(该属性更多地用于测试。)我们正在考虑如何进行默认绑定。

您可能会考虑使用 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();
  }
}

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

于 2013-08-25T19:07:18.840 回答