我正在尝试用Dagger-2取代Guice。到目前为止,一切看起来都很好,但有一件事我找不到惯用的解决方案。
假设我有一个我无法扩展且无法控制代码的类。另外,我无法创建该类的实例。实例将由另一个框架创建 - 但不是初始化的。我偶然发现了MembersInjector<T>
接口,但它似乎只处理带注释的类。我正在寻找一种方法来提供MemebersInjector<Type>
的实现(参见下面的示例代码)。
final class Type {
A a;
B b;
public Type() {
}
public void initialize(A a, B b) {this.a=a; this.b=b};
}
我的组件和模块可以提供A
和B
。
我正在寻找的是像
@Component(modules = MyModule.class)
interface MyComponent {
Type inject(Type t);
}
或
@Component(modules = MyModule.class)
interface MyComponent {
MembersInjector<Type> getTypeInjector();
}
以及提供我自己的MembersInjector
实现方式。
我试过这样的事情
@Module
class MyModule {
@Provides
MembersInjector<Type> provideTypeInjector(A a, B b) {
return instance -> {
instance.initialize(a, b);
}
}
}
但是Dagger-2并不满意。
知道如何使这项工作吗?
答案 0 :(得分:1)
除了创建自己的POJO之外,我不认为这是一种惯用的方法,而且这可能很好。
@Component inject(T)
方法或MembersInjector<T>
实例的值是您是如何根据T
&#请求Dagger写入的对象的方式39; s @Inject
注释。如果Dagger没有为您扫描课程并为您生成对象,那么您无论如何都要负责填充对象,因此您也可以编写自己的初始化程序。
class YourTypeInitializer { // nothing to extend or implement
private final Provider<A> aProvider;
private final Provider<B> bProvider;
@Inject YourTypeInitializer(Provider<A> aProvider, Provider<B> bProvider) {
this.aProvider = aProvider;
this.bProvider = bProvider;
}
public YourType inject(YourType instance) {
instance.initialize(aProvider.get(), bProvider.get());
return instance; // for convenience
}
}
或使用现场注射:
class YourTypeInitializer {
@Inject Provider<A> aProvider;
@Inject Provider<B> bProvider;
@Inject YourTypeInitializer() {}
public YourType inject(YourType instance) {
instance.initialize(aProvider.get(), bProvider.get());
return instance; // for convenience
}
}
然后,注入MembersInjector<YourType>
,而不是注入YourTypeInitializer
;而不是致电yourComponent.inject(yourTypeInstance)
,只需致电yourComponent.getYourTypeInitializer().inject(yourTypeInstance)
。它有点样板,但如果没有@Inject
注释,那么Dagger很少能为你做替代。