GIN支持类似儿童注射器的功能吗



我有一个包含子应用程序的应用程序。我想隔离GIN注入,这样每个子应用程序都可以拥有相同核心共享类的单独实例。我还希望注入器将一些核心模块中的类提供给所有子应用程序,以便可以共享单例实例。例如

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

在Guice中,我可以使用createChildInjector来实现这一点,但在GIN中看不到明显的等价物。

我能在GIN中实现类似的目标吗?

多亏了@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());

在SOF上http://code.google.com/p/google-gin/wiki/PrivateModulesDesignDoc.希望它能帮助你。

相关内容

  • 没有找到相关文章

最新更新