我正在尝试绑定(bind)同一接口(interface)的两个特定实现。一个是常规服务,应该普遍使用,另一个是第一个服务的变体,它增加了缓存。后者必须仅提供给几个类,而不是常用的类。
我了解 Guice 中的所有绑定(bind),包括命名和注释绑定(bind),但它们都不适合我的场景。我不希望我的客户必须使用特定的注释或字符串值。它知道的越少越好。向其提供哪个依赖项的决定必须来自外部,即来自模块。
因此,如果命名和注释绑定(bind)消失,我只能绑定(bind)到具体实例。这是一个解决方案,因为它允许我在客户端的构造函数中提供特定的依赖关系,但我仍然发现它不是最佳的。
你会建议我做什么?
最佳答案
您的问题与需要 private modules 的问题非常相似,除了私有(private)模块绑定(bind)不能与注入(inject)器中的全局绑定(bind)冲突。表达“此绑定(bind)适用于除此其他私有(private)模块之外的任何地方”会很棘手。
当您的构造函数无法注释以单独表达依赖项时,一种方法是手动创建您的类(即包装您的构造函数)。这意味着只要构造函数发生更改,您的包装器就需要更改,但这可能不会有太大问题。
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);
}
}
关于java - 在 Guice 中提供对特定客户端的特定依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29150577/