可选注射匕首2

Cog*_*man 6 java dependency-injection dagger-2

是否可以选择在匕首2中插入值?我尤其想做这样的事情。

@Inject A(Optional<B> b) {
  this.b = b;
}
Run Code Online (Sandbox Code Playgroud)

如果B在模块中未定义,我想用匕首给出一个Optional.empty(),如果已定义则给定Optional.of(value)

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

Min*_*Man 5

可选注入需要一个模块为您的组件添加可选绑定,因为Dagger需要依赖关系图上的每个依赖,甚至是明确缺少的依赖。当您希望通过实现来实现此可选选项时,您将向组件(通常是子组件)添加要实现的impl绑定模块。

以下是模块的外观:

@Module
public interface OptionalModule {
  @BindsOptionalOf
  Foo bindOptionalFoo();
}
Run Code Online (Sandbox Code Playgroud)

@Module
public interface ImplModule {
  @Binds
  Foo bindFooImpl(FooImpl foo);
}
Run Code Online (Sandbox Code Playgroud)

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

public class Bar {
  @Inject
  public Bar(Optional<Foo> optionalFoo) {}
}
Run Code Online (Sandbox Code Playgroud)

要么

public class Bar {
  @Inject
  public Optional<Foo> optionalFoo;
}
Run Code Online (Sandbox Code Playgroud)