我有一个包含子应用程序的应用程序。我想隔离GIN注入,以便每个子应用程序可以具有相同核心共享类的单独实例。我还希望注入器从一些核心模块向所有子应用程序提供类,以便可以共享单例实例。 e.g。
GIN Modules:
Core - shared
MetadataCache - one per sub-application
UserProvider - one per sub-application
在Guice中,我可以使用createChildInjector
执行此操作,但我无法在GIN中看到明显的等效内容。
我可以在GIN中实现类似的东西吗?
答案 0 :(得分:4)
由于@Abderrazakk提供的链接,我解决了这个问题,但由于链接不是很快就有说明,我想我也会在这里添加一个示例解决方案:
私有GIN模块允许您进行单级分层注入,其中在私有模块内注册的类型仅对该模块中创建的其他实例可见。在任何非私人模块中注册的类型仍可供所有人使用。
示例强>
让我们注入一些样本类型(并注入):
public class Thing {
private static int thingCount = 0;
private int index;
public Thing() {
index = thingCount++;
}
public int getIndex() {
return index;
}
}
public class SharedThing extends Thing {
}
public class ThingOwner1 {
private Thing thing;
private SharedThing shared;
@Inject
public ThingOwner1(Thing thing, SharedThing shared) {
this.thing = thing;
this.shared = shared;
}
@Override
public String toString() {
return "" + this.thing.getIndex() + ":" + this.shared.getIndex();
}
}
public class ThingOwner2 extends ThingOwner1 {
@Inject
public ThingOwner2(Thing thing, SharedThing shared) {
super(thing, shared);
}
}
创建两个这样的私有模块(使用ThingOwner2作为第二个):
public class MyPrivateModule1 extends PrivateGinModule {
@Override
protected void configure() {
bind(Thing.class).in(Singleton.class);
bind(ThingOwner1.class).in(Singleton.class);
}
}
共享模块:
public class MySharedModule extends AbstractGinModule {
@Override
protected void configure() {
bind(SharedThing.class).in(Singleton.class);
}
}
现在在我们的注射器中注册两个模块:
@GinModules({MyPrivateModule1.class, MyPrivateModule2.class, MySharedModule.class})
public interface MyGinjector extends Ginjector {
ThingOwner1 getOwner1();
ThingOwner2 getOwner2();
}
最后,我们可以查看并看到ThingOwner1和ThingOwner2实例与共享模块具有相同的SharedThing实例,但不同于其私有注册的Thing实例:
System.out.println(injector.getOwner1().toString());
System.out.println(injector.getOwner2().toString());
答案 1 :(得分:2)
这是SOF http://code.google.com/p/google-gin/wiki/PrivateModulesDesignDoc。 希望它可以帮助你。