Поддерживает ли GIN что-нибудь вроде дочерних инжекторов?

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

  •  14-11-2019
  •  | 
  •  

Вопрос

У меня есть одно приложение, содержащее подприложения.Я хотел бы разделить внедрение 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());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top