我试图学习Guice,但下面的场景似乎很难。比方说,我有类A,B和C.我应该能够做到以下几点(注意,这个例子稍微简化实际情况):Guice和“范围”单身人士
- A是全球单
- 一个上有依赖ProviderB(即工厂)
- B对A和ProviderC(即工厂)依赖性
- C具有的依赖关系和B
当B创建C,C的依赖性B必须是相同的实例即从C的角度来看,B是单身人士。
我曾尝试创建子注入:
private static class MainModule extends AbstractModule{
@Override
protected void configure() {
bind(A.class).in(Singleton.class);
}
@Provides
B createB(Injector injector){
return injector.createChildInjector(new SubModule()).getInstance(B.class);
}
}
private static class SubModule extends AbstractModule{
@Override
protected void configure() {
bind(B.class).in(Singleton.class);
bind(C.class);
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new MainModule());
A a = injector.getInstance(A.class);
B b1 = a.getB();
B b2 = a.getB();
// all following C's are different instances
C b1c1 = b1.getC(); //this has b1 and a
C b1c2 = b1.getC(); //this has b1 and a
C b2c1 = b2.getC(); //this has b2 and a
C b2c2 = b2.getC(); //this has b2 and a
}
但随后吉斯给出了B已经绑定错误(中MainModule提供的方法)。因此,我需要重写MainModule的B绑定,但这似乎是不可能的,使用子注入器。
该问题可以通过使用多个喷射器来解决,例如,为createB方法创建一个新的方法并注入A作为参数,但似乎使用多个注入器并不是最佳实践。
编辑:添加注释到C实例阐明他们应该有其B的实例
是否有一个原因,MainModule和SubModule不能同时安装到初始注射器,或者你可以'用'@ Singleton'注释'@Provides createB(...)'? – 2015-03-03 19:46:36
嗯,也许我有点不清楚,是否更加清楚,如果我说每个B的依赖关系,B被认为是单身,但在其他地方可以有多个B,即每次A.getB被调用时,它返回一个新实例。如果我用@Singleton对createB进行注释,那么我猜测B会被认为是单身人士。 – 2015-03-04 08:32:31
我还可以注意到目前为止,父注入器只有单例绑定(在这里,在实际应用中更多),所以我可以使用父注入器创建SubModule,注入每个单例,再将它们绑定为单例并创建全新的顶层在使用B之前先要注入高级别的喷油器,但是我想避免再次写入它们。 – 2015-03-04 08:46:19