【发布时间】:2013-03-13 05:45:25
【问题描述】:
我的 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 实例。
有什么想法吗?
【问题讨论】:
-
我相信这就是所谓的“机器人腿”问题。查看code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions,然后向下滚动到“如何构建两个相似但略有不同的对象树?”
标签: java dependency-injection guice