Поддерживает ли GIN что-нибудь вроде дочерних инжекторов?
Вопрос
У меня есть одно приложение, содержащее подприложения.Я хотел бы разделить внедрение GIN, чтобы каждое подприложение могло иметь отдельные экземпляры одних и тех же основных общих классов.Я также хочу, чтобы инжектор предоставлял классы из некоторых основных модулей всем подприложениям, чтобы можно было использовать общие экземпляры Singleton.например
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 / PrivatemoduelsDesigndoc . Надеюсь, это поможет вам.
Другие советы
Я решил это благодаря ссылке, предоставленной @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());