Динамическое внедрение зависимости

Я хочу добиться динамического внедрения зависимостей. GUICE поддерживает это? Если нет, не могли бы вы порекомендовать какую-либо другую структуру DI?

Реализация, которая должна использоваться для внедрения через @Inject, должна быть определена во время выполнения, например, через взаимодействие с пользователем.

Аналогично этим вопросам: http://www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html

Спасибо

2 ответа

Решение

Реализация должна варьироваться в зависимости от ввода, в какой-то момент вам придется разрешить ввод в некоторый класс.

Если вы хотите, чтобы это отображение существовало в Guice, то вы в основном получаете реализацию, основанную на параметре, который соответствует SO-вопросу, на который я только что ответил здесь. Вы можете написать небольшой инъецируемый класс, который принимает входные данные и возвращает полностью внедренную реализацию.

Если у вас уже есть это отображение и у вас есть (например) литерал класса в переменной, то вы можете просто вставить Injector напрямую и попросите его о реализации.

class YourClass {
  @Inject Injector injector;

  SomeInterface yourMethod(String input) {
    Class<? extends SomeInterface> clazz = getClassLiteralFromInput(input);
    return injector.getInstance(clazz);
  }

  Class<? extends SomeInterface> getClassLiteralFromInput(String input) {
    // Implement this as needed.
    return SomeInstance.class;
  }
}

Обратите внимание, что, хотя вы всегда можете ввести Injector, вы должны делать это только тогда, когда вы действительно не знаете, какая реализация вам нужна (как здесь). В общем, вы должны ввести SomeInstance сам или Provider<SomeInstance> если вы хотите отложить создание.

Когда-то у нас было похожее требование, поэтому мы использовали шаблон фабрики и добавили все реализации в реализации класса фабрики, используя spring.

Таким образом, когда во время выполнения мы будем знать, какую реализацию использовать, мы вызовем мою фабрику, чтобы предоставить класс реализации.

Кроме того, каждый раз, когда у вас есть больше реализаций, вы можете обновить конфигурацию Spring для фабричного класса.

Это может не соответствовать дизайну, который вы имеете в виду, но это решило для нас цель.

Ура!!

Другие вопросы по тегам