我想实现动态依赖注入。GUICE 支持这个吗?如果没有,您能推荐任何其他 DI 框架吗?
应该用于通过@Inject 进行注入的实现必须在运行时确定,例如通过与用户的交互。
类似于这些问题: http: //www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html
谢谢
我想实现动态依赖注入。GUICE 支持这个吗?如果没有,您能推荐任何其他 DI 框架吗?
应该用于通过@Inject 进行注入的实现必须在运行时确定,例如通过与用户的交互。
类似于这些问题: http: //www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html
谢谢
实现需要根据输入而有所不同,在某些时候,您将不得不将输入解析为某种类。
如果您希望该映射存在于 Guice 中,那么您基本上会获得一个基于参数的实现,该实现映射到我刚刚回答的 SO 问题。您可以编写一个小的可注入类,它接受输入并返回一个完全注入的实现。
如果您已经拥有该映射并且(例如)在变量中有一个类文字,那么您可以直接注入一个Injector
并要求它实现。
class YourClass {
@Inject Injector injector;
SomeInterface yourMethod(String input) {
Class<? extends SomeInterface> clazz = getClassLiteralFromInput(input);
return injector.getInstance(clazz);
}
Class<? extends SomeInterface> getClassLiteralFromInput(String input) {
// Implement this as needed.
return SomeInstance.class;
}
}
请注意,虽然您始终可以注入 Injector,但只有在您真的不知道需要哪种实现时才应该这样做(如此处)。一般来说,你应该注入它SomeInstance
本身,或者Provider<SomeInstance>
如果你想延迟创建。
我们曾经有过类似的需求,所以我们所做的是使用工厂模式并使用 spring 将所有实现添加到工厂类实现中。
这样,当我们在运行时知道要使用哪个实现时,我们会调用我的工厂以提供实现类。
此外,只要您有更多实现,您就可以更新工厂类的 spring 配置。
这可能与您的想法不太接近,但这解决了我们的目的。
干杯!!