可选注射Dagger 2

时间:2016-08-26 22:44:43

标签: java dependency-injection dagger-2

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

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

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

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

2 个答案:

答案 0 :(得分:5)

可选注入需要一个模块来向组件添加可选绑定,因为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;
}

答案 1 :(得分:0)

您正在寻找@BindsOptionalOf