Лучший подход для видоизменения (добавляют/удаляют привязку), инжектор Guice при поддержании состояния

Я надеюсь переопределить или обновить некоторую привязку в Модуле, который в свою очередь используется Инжектором. Я понимаю, что Модули неизменны и после того как привязка высосана и ввела свое определение, не может измениться для всех практических целей.

Я хотел бы добавить/изменить/удалить привязку при хранении одиночных элементов, уже живущих в Инжекторе. Изменение является простым случаем, поскольку можно достигнуть этого эффекта при помощи Поставщика. Однако динамично добавление или удаление Ключа (обязательное определение) немного более хитры.

Любые мысли, если это должно или может быть практически сделано.

Я думаю, что лучший способ состоит в том, чтобы воссоздать инжектор каждый раз, когда добавить/удалить привязка происходит, копируя определения от оригинала до нового, Любые существующие одиночные элементы были бы переопределены toInstance, а не к типу реализации и т.д.

9
задан mP. 20 June 2010 в 01:44
поделиться

1 ответ

Для этого можно использовать дочерние инжекторы, но это требует некоторой настройки. Дочерние инжекторы не позволят долгоживущим связям зависеть от короткоживущих. Вот пример:

class ForeverModule extends AbstractModule {
  ...
}

class TemporaryModule extends AbstractModule {
  ...
}

class Main {
    public static void main(String... args) {
        Injector foreverInjector = Guice.createInjector(new ForeverModule());

        Injector injector = foreverInjector.createChildInjector(
                new TemporaryModule());
        /*
         * Do stuff with the injector as you would normally. When you
         * get bored of that injector, create a replacement injector
         * as a child of the long-lived injector.
         */
    }
}

Связки Singleton в вечном модуле будут существовать до тех пор, пока существует этот модуль. Связки Singleton во временном модуле будут существовать до тех пор, пока вы используете соответствующий инжектор.

Предупреждение: По умолчанию привязки just-in-time будут создаваться в инжекторе верхнего уровня. Если вам нужно, чтобы привязка была недолговечной, вам нужно связать и интерфейс, и реализацию в модуле дочернего инжектора. Это выглядит следующим образом:

    public void configure() {
        bind(Foo.class).to(RealFoo.class);
        bind(RealFoo.class);
    }
8
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: