我有两个 Runnable
类,我想在它们之间注入依赖关系,以便 SecondProcedure
使用 FirstProcedure
创建的 Table
运行 .
class FirstProcedure implements Runnable {
private Table composers = new Table();
public void run() {
// populates the composers table
}
public Table getComposers() {
return composers;
}
}
class SecondProcedure implements Runnable {
private Table composers;
public void run() {
// writes the name of each composer to the console
}
public Table setComposers(final Table composers) {
this.composers = composers;
}
}
我的想法是,在我的主类中,我可以实例化两个过程,注入相关的表(即使它不会被这一点填充也应该正确引用),计算出两个过程之间的依赖关系,然后运行他们的顺序正确 . 即,这两个程序中的每个程序都会有一个唯一的实例(但我故意避免使用Singleton(反)模式,以便我可以进行适当的单元测试) .
我怎样才能使用Guice来解决这个问题?我可以用以下内容注释 setComposers
方法吗?
@InjectTable(procedure=FirstProcedure.class, name="composers")
public Table setComposers(final Table composers) {
this.composers = composers;
}
并有一个Guice模块,它将根据提供的字段的类和名称绑定 SecondProcedure
中的 Table
?
在 AbstractModule
的 bind()
方法中,我没有看到任何适合这种范式的东西 .
(除此之外,我不太热衷于这个注释本身的设计,字段的名称在字符串中,而不是以某种方式明确地引用该方法 . )
1 回答
我认为你可能会使问题过于复杂 .
看起来SecondProcedure对Table有一个简单的依赖:
FirstProcedure是表的提供者:
然后,您的模块只需要绑定提供者:
@Inject带注释的构造函数的JIT绑定将提供SecondProcedure,因此您不需要显式绑定它 .
完成此操作后,您可以考虑将FirstProcedure的名称更改为TableProvider .
要使用FirstProcedure,您只需注入它,或从进样器中获取它:
另外,Guice单例模式(@Singleton范围)不是反模式,因为它仅限于注入器 . 有很多情况下它是合适的,Guice单例实现不会妨碍测试 .
也许你应该关注的是静态 . Guice本身提供了一个很好的解释为什么它是坏的:http://code.google.com/p/google-guice/wiki/AvoidStaticState