为Guice中的特定客户提供特定依赖

时间:2015-03-19 16:56:33

标签: java guice

我正在尝试绑定同一接口的两个特定实现。一个是常规服务,一般应该使用,另一个是第一个的变体,它增加了缓存。后者必须仅提供给几个类,而不是通常使用的类。

我知道所有关于Guice中的绑定,包括命名和注释绑定,但它们都不适合我的场景。我不希望我的客户端必须使用特定的注释或字符串值。知道的越少越好。决定依赖它提供给它,必须来自外部,即来自模块。

因此,如果命名和注释绑定已经完成,我将继续绑定到具体实例。这是一个解决方案,因为它允许我在客户端的构造函数中提供特定的依赖关系,但我仍然发现它不是最理想的。

你建议我做什么?

1 个答案:

答案 0 :(得分:0)

您的问题非常类似于需要private modules的问题,除了私有模块绑定不能与Injector中的全局绑定冲突。表达“此绑定应用除了在其他私有模块之外的任何地方”是很棘手的。

当您的构造函数无法单独表达deps时,一种方法是手动创建类(即包装构造函数)。这意味着你的包装器需要在构造函数发生变化时进行更改,但这可能不是很有问题。

public class CachingModule extends AbstractModule {
  @Override public void configure() {}

  // You could also write and bind a full Provider<T>, but this is more concise.
  @Provides FirstClassThatNeedsCaching provideFirst(
      CachingService service, Dep2 dep2) {
    return new FirstClassThatNeedsCaching(service, dep2);
  }

  @Provides SecondInterface provideSecond(CachingService service, Dep3 dep3) {
    return new SecondClassThatNeedsCaching(service, dep3);
  }
}