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

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

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

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

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

1 Ответ

8 голосов
/ 20 июня 2010

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

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.
         */
    }
}

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

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

    public void configure() {
        bind(Foo.class).to(RealFoo.class);
        bind(RealFoo.class);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...