4

サブアプリケーションを含む 1 つのアプリケーションがあります。各サブアプリケーションが同じコア共有クラスの個別のインスタンスを持つことができるように、GIN インジェクションを分離したいと考えています。また、シングルトン インスタンスを共有できるように、インジェクターがいくつかのコア モジュールからすべてのサブアプリケーションにクラスを提供するようにしたいと考えています。例えば

GIN Modules:
  Core - shared
  MetadataCache - one per sub-application
  UserProvider - one per sub-application

Guice では を使用してこれを行うことができますcreateChildInjectorが、GIN では明らかに同等のものを見つけることができません。

GINで同様のことを達成できますか?

4

2 に答える 2

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);
    }
}

次のように 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();
}

最後に、ThingOwner1 と ThingOwner2 の両方のインスタンスが、共有モジュールからの同じ SharedThing インスタンスを持っていることを確認できますが、プライベート登録からは異なる Thing インスタンスがあります。

System.out.println(injector.getOwner1().toString());
System.out.println(injector.getOwner2().toString());
于 2012-01-27T14:01:12.637 に答える
2

こちらはSOFhttp://code.google.com/p/google-gin/wiki/PrivateModulesDesignDocにあります。それがあなたを助けることを願っています。

于 2012-01-26T15:55:33.823 に答える