我的 Java 代码使用接口的多个实现(下例中的 BugTemplate),其中绑定的实现取决于上下文。
在 Guice 中,我相信实现这一点的正确方法是使用 BindingAnnotations。但是,我的用例与规范示例不同,因为上下文从接口的实现中移除了一层。
总结可能的依赖关系:
FooBugFinder -> BugFiler -> FooBugTemplate
BarBugFinder -> BugFiler -> BarBugTemplate
等等
示例代码:
class FooBugFinder {
// ...
public findBugsAndFileThem() {
List<Bug> bugs = findBugs();
bugFiler.fileBugs(bugs);
}
@Inject
FooBugFinder(BugFiler bugFiler) {
// BugFiler should have been instantiated with a FooBugTemplate.
this.bugFiler = bugFiler;
}
}
class BugFiler {
// ...
public fileBugs(List<Bug> bugs) {
List<FormattedBugReport> bugReports = bugTemplate.formatBugs(bugs);
fileBugReports(bugReports);
}
@Inject
BugFiler(BugTemplate bugTemplate) {
// The specific implementation of BugTemplate is context-dependent.
this.bugTemplate = bugTemplate;
}
}
interface BugTemplate {
List<FormattedBugReport> formatBugs(List<Bug> bugs);
}
class FooBugTemplate implements BugTemplate {
@Overrides
List<FormattedBugReport> formatBugs(List<Bug> bugs) {
// ...
}
}
我的第一个想法是对 ctor 进行如下注释:
FooBugFinder(@Foo BugFiler bugFiler) { }
但是,当向 BugFiler 的构造函数注入参数时,Guice 怎么知道应用该注释呢?
换句话说,FooBugFinder 需要一个使用 FooBugTemplate 实例化的 BugFiler 实例。BarBugFinder 需要一个使用 BarBugTemplate 实例化的 BugFiler 实例。
有任何想法吗?