문제

하위 애플리케이션이 포함된 애플리케이션이 하나 있습니다.각 하위 애플리케이션이 동일한 핵심 공유 클래스의 별도 인스턴스를 가질 수 있도록 GIN 주입을 분리하고 싶습니다.또한 인젝터가 일부 핵심 모듈의 클래스를 모든 하위 애플리케이션에 제공하여 싱글톤 인스턴스를 공유할 수 있기를 원합니다.예를 들어

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

Guice에서는 다음을 사용하여 이 작업을 수행할 수 있습니다. createChildInjector, 그러나 GIN에서는 이에 상응하는 것을 볼 수 없습니다.

GIN에서도 비슷한 것을 얻을 수 있나요?

도움이 되었습니까?

해결책

여기에서는 http://code.google.com/p/ google-gin / wiki / privatemodulesdesigndoc . 희망이 당신을 돕기를 바랍니다.

다른 팁

@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());
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top