Ginは子供の注射器のようなものは何もサポートしていますか?

StackOverflow https://stackoverflow.com/questions/9016009

  •  14-11-2019
  •  | 
  •  

質問

サブアプリケーションを含む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());
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top