可选注射匕首2

Optional injection Dagger 2

是否可以选择性地在 dagger 2 中注入一个值?特别是,我想做这样的事情。

@Inject A(Optional<B> b) {
  this.b = b;
}

如果 B 在模块中未定义,我希望 dagger 给出 Optional.empty(),如果已定义,则给出 Optional.of(value).

这是可行的还是我需要一个定义这些可选值的模块?

您正在寻找 @BindsOptionalOf.

可选注入需要一个模块来将可选绑定添加到您的组件,因为 Dagger 需要依赖图上的每个依赖项,即使是显式缺失的依赖项。当你想用一个实现来实现这个可选时,你将向一个组件添加一个 impl 绑定模块,通常是一个子组件,它想要实现它。

以下是模块的外观:

@Module
public interface OptionalModule {
  @BindsOptionalOf
  Foo bindOptionalFoo();
}

@Module
public interface ImplModule {
  @Binds
  Foo bindFooImpl(FooImpl foo);
}

然后你可以构造函数或成员注入 Optional

public class Bar {
  @Inject
  public Bar(Optional<Foo> optionalFoo) {}
}

public class Bar {
  @Inject
  public Optional<Foo> optionalFoo;
}