我很难找到如何拥有“动态 AssistedInject”。我的意思是我想根据参数向工厂提供它需要在运行时使用的实现类名。这是我目前拥有的:
interface Letter {}
abstract class ALetter implements Letter {
public ALetter(T1 t1, T2 t2) {...}
}
class A implements Letter {
public static final NAME = "A";
@Inject
public A(@Assisted T1 t1, T2 t2) { super(t1, t2); }
}
class B implements Letter {
public static final NAME = "B";
@Inject
public B(@Assisted T1 t1, T2 t2) { super(t1, t2); }
}
考虑到我将拥有 T1 但我需要注入 T2,我希望能够根据他们的名称加载 A 或 B。它可能看起来像:
class MyClass {
@Inject
public MyClass(RequestData data, MyConfig config, ILetterFactory letterFactory) {
Letter letter = letterFactory.get(data.getLetterName(), config.getT2());
}
}
我会使用类似的东西配置 ILetterFactory:
install(new FactoryModuleBuilder().build(ILetterFactory.class));
但我知道这目前不起作用,因为字母名称不是我的构造函数的真正参数,而 Guice 不能那样工作。它应该让你知道我想要什么。
我目前发现的唯一解决方案不使用 Guice:我有自己的工厂,它根据名称(通过 a Map<String, Constructor>
)解析类构造函数,并调用newInstance
为它提供适当的参数(除了工厂本身之外,根本没有注入)。
有没有办法使用 Guice 来避免自己创建那个工厂?谢谢