3

我想实现动态依赖注入。GUICE 支持这个吗?如果没有,您能推荐任何其他 DI 框架吗?

应该用于通过@Inject 进行注入的实现必须在运行时确定,例如通过与用户的交互。

类似于这些问题: http: //www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html

谢谢

4

2 回答 2

1

实现需要根据输入而有所不同,在某些时候,您将不得不将输入解析为某种类。

如果您希望该映射存在于 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>如果你想延迟创建。

于 2013-07-16T17:42:53.977 回答
0

我们曾经有过类似的需求,所以我们所做的是使用工厂模式并使用 spring 将所有实现添加到工厂类实现中。

这样,当我们在运行时知道要使用哪个实现时,我们会调用我的工厂以提供实现类。

此外,只要您有更多实现,您就可以更新工厂类的 spring 配置。

这可能与您的想法不太接近,但这解决了我们的目的。

干杯!!

于 2013-07-16T15:48:27.253 回答