Dagger2 如何基于 java class 进行注入?
Dagger2 How can I inject based on a java class?
我有一个包含一堆 类 的枚举,目前正在使用 Class
对象上的 newInstance()
方法创建它们。我想在这里开始使用依赖注入。
用原来的匕首我可以说ObjectGraph#get(item.getClazz())
。有没有办法用 Dagger2 实现类似的东西? (我真的很喜欢 dagger2 界面,不想回到 dagger1)。
Dagger 2 没有任何通过 Class
对象获取实例的内置机制。
根据您的示例代码,我猜您的枚举类似于:
enum Item {
ONE(A.class),
TWO(B.class);
private final Class<?> clazz;
private Item(Class<?> clazz) { this.clazz = clazz; }
Class<?> getClazz() { return clazz; }
}
为了获得与您建议的 ObjectGraph
版本行为相似的调用代码,您需要一个 @Component
,其中包含 Item
引用的每种类型的方法。
@Component
interface MyComponent {
A getA();
B getB();
}
现在,您可以更新 Item
以改为委托给 MyComponent,并且完全不需要 class 文字。
enum Item {
ONE {
@Override A getObject(MyComponent component) {
return component.getA();
}
},
TWO {
@Override B getObject(MyComponent component) {
return component.getB();
}
};
abstract Object getObject(MyComponent component);
}
现在,您只需调用 item.getObject(myComponent)
即可获得相同效果,而不是 ObjectGraph#get(item.getClazz())
。
我有一个包含一堆 类 的枚举,目前正在使用 Class
对象上的 newInstance()
方法创建它们。我想在这里开始使用依赖注入。
用原来的匕首我可以说ObjectGraph#get(item.getClazz())
。有没有办法用 Dagger2 实现类似的东西? (我真的很喜欢 dagger2 界面,不想回到 dagger1)。
Dagger 2 没有任何通过 Class
对象获取实例的内置机制。
根据您的示例代码,我猜您的枚举类似于:
enum Item {
ONE(A.class),
TWO(B.class);
private final Class<?> clazz;
private Item(Class<?> clazz) { this.clazz = clazz; }
Class<?> getClazz() { return clazz; }
}
为了获得与您建议的 ObjectGraph
版本行为相似的调用代码,您需要一个 @Component
,其中包含 Item
引用的每种类型的方法。
@Component
interface MyComponent {
A getA();
B getB();
}
现在,您可以更新 Item
以改为委托给 MyComponent,并且完全不需要 class 文字。
enum Item {
ONE {
@Override A getObject(MyComponent component) {
return component.getA();
}
},
TWO {
@Override B getObject(MyComponent component) {
return component.getB();
}
};
abstract Object getObject(MyComponent component);
}
现在,您只需调用 item.getObject(myComponent)
即可获得相同效果,而不是 ObjectGraph#get(item.getClazz())
。