我有两个Runnable
类,我想在它们之间注入依赖关系,以便SecondProcedure
使用Table
创建的FirstProcedure
运行。
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模块,它会根据提供的字段的类和名称绑定Table
中的SecondProcedure
?
我在bind()
的{{1}}方法中看不到任何符合此范例的内容。
(除此之外,我不太热衷于这个注释本身的设计,字段的名称在字符串中,而不是以某种方式明确地引用该方法。)
答案 0 :(得分:0)
我认为你可能会使问题过于复杂。
看起来SecondProcedure对表有一个简单的依赖:
class SecondProcedure {
@Inject
SecondProcedure(Table table) {
this.table = table;
}
}
FirstProcedure是表的提供者:
class FirstProcedure implements Provider<Table> {
public Table get() {
return buildTheTable();
}
}
您的模块只需要绑定提供者:
class SomeModule extends AbstractModule {
protected void configure() {
bind(Table.class).toProvider(FirstProcedure.class);
}
}
@Inject带注释的构造函数的JIT绑定将提供SecondProcedure,因此您不需要显式绑定它。
完成此操作后,您可以考虑将FirstProcedure的名称更改为TableProvider。
要使用FirstProcedure,您只需注入它,或从进样器中获取它:
injector.getInstance(FirstProcedure.class).run();
另外,Guice单例模式(@Singleton范围)不是反模式,因为它仅限于注入器。有很多情况下它是合适的,Guice单例实现不会妨碍测试。
也许您应该关注的是静态。 Guice本身提供了一个很好的解释为什么它是坏的:http://code.google.com/p/google-guice/wiki/AvoidStaticState