我想实现DYNAMIC依赖注入。 GUICE支持这个吗?如果没有,你能推荐任何其他DI框架吗?
必须在运行期间确定应通过@Inject进行注入的实现,例如通过与用户的互动。
与这些问题相似: http://www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html
谢谢
答案 0 :(得分:1)
实现需要根据输入而变化,在某些时候你将不得不将输入解析为某种类。
如果您希望该映射生效在Guice中,那么您基本上可以根据参数获取实现,该参数映射到the SO question I just answered here。您可以编写一个小的可注入类来获取输入并返回完全注入的实现。
如果您已经拥有该映射并且在变量中具有(例如)类文字,那么您只需inject an Injector
directly并询问其实现。
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>
。
答案 1 :(得分:0)
我们曾经有类似的要求,所以我们做的是使用工厂模式,并使用spring在工厂类实现中添加所有实现。
这样,在运行时我们会知道要使用哪个实现,我们会调用我的工厂来提供实现类。
此外,只要您有更多实施,您就可以更新工厂类的弹簧配置。
这可能与你想到的设计不太接近,但这解决了我们的目的。
干杯!!