Динамическое внедрение зависимости
Я хочу добиться динамического внедрения зависимостей. 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 для фабричного класса.
Это может не соответствовать дизайну, который вы имеете в виду, но это решило для нас цель.
Ура!!