Ginは子供の注射器のようなものは何もサポートしていますか?
質問
サブアプリケーションを含む1つのアプリケーションがあります。各サブアプリケーションが同じコア共有クラスの個別のインスタンスを持つことができるように、GIN注入を分離したいと思います。また、一部のコアモジュールからすべてのサブアプリケーションにクラスを供給するためのインジェクタに、シングルトンインスタンスを共有できます。e.g.
GIN Modules:
Core - shared
MetadataCache - one per sub-application
UserProvider - one per sub-application
.
Guiceでは、createChildInjector
を使ってこれを行うことができますが、Ginでは明らかな同等のものがわかりません。
ginで似たようなものを達成することができますか?
解決
ここではSOF http://code.google.com/p/ Google-Gin / Wiki / PrivateModulesDesignDoc 。 それがあなたを助けることを願っています。
他のヒント
私は@abderrazakkによって与えられたリンクのおかげでこれを解決しました、しかしリンクが説明されていないように私はここでもサンプルソリューションを追加すると思いました:
プライベートジンモジュールを使用すると、単一レベルの階層インジェクションを使用できます。ここで、プライベートモジュール内に登録されている型は、そのモジュール内で作成された他のインスタンスにのみ表示されます。非プライベートモジュール内に登録されているタイプはまだすべて存在します。
例
挿入(および注入する)にサンプルタイプがいくつかあります。
.
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);
}
}
このような2つのプライベートモジュールを作成する(2番目のものに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);
}
}
インジェクタに2つのモジュールを登録する:
.
@GinModules({MyPrivateModule1.class, MyPrivateModule2.class, MySharedModule.class})
public interface MyGinjector extends Ginjector {
ThingOwner1 getOwner1();
ThingOwner2 getOwner2();
}
最後に、Shared ModuleとShareDingのインスタンスと同じShareAdingインスタンスがあることを確認して確認しますが、プライベート登録からの異なる事項のインスタンス:
.System.out.println(injector.getOwner1().toString());
System.out.println(injector.getOwner2().toString());