我有一个带有构造函数的类,例如:

@Inject
public ClassTest(ITestInterface testInterface, Class<?> clazz){
    ...
}


问题是我如何将一个类绑定到可以在此构造函数中注入的实现,并且ClassTest绑定会选择正确的类吗?

我想在不同的时间注入不同的类。当我尝试解决它时,Guice给出了一个错误,它无法在java.lang.Class上找到任何合适的构造函数。

最佳答案

我认为您必须使用Guice的assisted inject扩展名。

基本上,您按原样定义ClassTest,但是将“变化的”依赖项标记为@Assisted

@Inject
public ClassTest(ITestInterface testInterface, @Assisted Class<?> clazz){
    ...
}


然后,为ClassTest对象创建一个工厂接口,该接口将接受Class参数并返回ClassTest s:

public interface ClassTestFactory {
    ClassTest create(Class<?> clazz);
}


然后,您将安装特殊类型的模块,该模块将为您创建工厂:

// Inside your module
install(new FactoryModuleBuilder().build(ClassTestFactory.class));


然后,在需要ClassTest实例的任何地方,都应改为插入ClassTestFactory接口:

@Inject
YourLogicClass(ClassTestFactory ctFactory) {
    this.ctFactory = ctFactory;
}


最后,您可以使用它为所需的每个类对象创建ClassTest

ClassTest ct1 = ctFactory.create(SomeClass.class);
ClassTest ct2 = ctFactory.create(AnotherClass.class);


但是,如果我是您,我真的会重新考虑整个类的体系结构,以避免此类事情的需要。

08-04 21:50