可选注射匕首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;
}
是否可以选择性地在 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;
}