Лучший способ поменять привязки Guice на основе параметра командной строки - PullRequest
1 голос
/ 16 сентября 2010

У меня есть основное приложение Java с довольно сложными аргументами командной строки.Эти аргументы в настоящее время обрабатываются классом CommandLineArgumentProcessor.Вот как выглядит мой текущий код:

public static void main(String[] args) {
   Injector injector = Guice.createInjector(new ConfigModule(), new WorkModule(), new ReportModule);
   injector.getInstance(I_CommandLineArgumentProcessor.class).processArguments(args);
   //Its not until here that I know if I should stub or not with this implementation
   ...
}

Сейчас я реализую способ заглушить некоторые классы для тестирования системы.Для этого мне нужно поменять некоторые привязки, которые использует Guice.Затем в командной строке я укажу определенные флаги для включения / выключения заглушки различной функциональности.Однако моя проблема в том, что аргументы не обрабатываются до тех пор, пока не будет создан инжектор.

Нужно ли иметь отдельную логику для обработки моих флагов заглушки до создания инжектора, а затем условно создать соответствующий инжектор?Я сомневаюсь в этом подходе, потому что он разделяет логику обработки аргументов командной строки на две области кода.Или есть другой (подходящий) способ заставить Guice подставлять различные объекты / поддеревья в графе объектов после создания инжектора?Или у меня есть один инжектор для процессора командной строки, а затем создать еще один для остальных модулей?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2010

Привязки инжектора неизменны после его создания (хотя сами привязки могут быть динамическими).Я бы предложил сначала создать инжектор, который связывает только то, что вам нужно для обработки командной строки.Затем выполните обработку в командной строке, получите флаги и используйте их при создании другого инжектора, который будет использовать фактическое приложение.Если есть вещи, которые нужно связать, чтобы иметь возможность выполнять обработку командной строки, которая понадобится и остальной части приложения, вы можете просто создать второй инжектор как дочерний инжектор первого.

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

1 голос
/ 16 сентября 2010

Рассматривали ли вы использование детских инъекций? Из вашего примера похоже, что ваша единственная потребность в корневой инъекции - получить экземпляр I_CommandLineArgumentProcessor. Без дополнительного контекста я бы предложил указать корневой инжектор с минимальными привязками, необходимыми для создания I_CommandLineArgumentProcessor.

Затем вы можете использовать ваш I_CommandLineArgumentProcessor в сочетании с некоторым другим внедренным классом, подобным провайдеру, чтобы вернуть вам модули для использования, которые вы передаете методу createChildInjector.

...