根据参数获取特定的实现实例

时间:2015-05-13 13:38:55

标签: java dependency-injection inversion-of-control guice

我正在使用Guice,我处于这种情况,我需要获取给定接口的特定实现,具体取决于某个参数。与setter / controller注入不同,我会在方法中请求实例,只有在调用方法时才知道参数的值。

我可以解决我的问题,使用经典工厂对象并注入工厂实例,我通常会在其中注入实现实例。我查看了Guice的提供程序,它们最初看起来很有前景,但似乎无法将参数传递给get()方法。

这是你怎么解决这个问题的?

1 个答案:

答案 0 :(得分:0)

Guice为名为Assisted Inject

的第一种方法提供工厂助手

但是,有可能使用Custom scopes做得更好。

我们的想法是seed对象注入依赖于Provider的参数。

看起来像是:

模块:

bind(CommandProperty.class).toProvider(ExchangeScope.<CommandProperty>seededKeyProvider()).in(ExchangeScope.class); //<< this is missing in tutorial

范围代码:

scope.enter();
try {
  // explicitly seed some seed objects...
  scope.seed(Key.get(CommandProperty.class), commandPropertyInstance);

  // create and access scoped objects
  runnable.run();

} finally {
  scope.exit();
}

提供者:

  private Provider<CommandProperty> commandPropertyProvider;
  private Map<CommandProperty, Provider<Object>> objectProviderMap;

  @Inject
  public ObjectProvider(Provider<CommandProperty> commandPropertyProvider, Map<CommandProperty, Provider<Object>> objectProviderMap) {
    this.commandPropertyProvider = commandPropertyProvider;
    this.objectProviderMap = objectProviderMap;
  }

  @Override
  public CommandProperty get() {
    CommandProperty commandP = commandPropertyProvider.get();
    return objectProviderMap.get(commandP).get();
  }

正如您所见,objectProviderMap将在运行时出现并可以注入。不同的是你摆脱了工厂,你可以创建对象的构造函数/ setter方式。垮台是你必须保持更大的代码复杂性。我宁愿使用像代码库那样的核心或框架而不是应用程序级别。