2014-01-24 3 views
1

У меня есть Injector экземпляра a, и я хотел бы создать еще один Injector b, который делает то же самое, как a, для двух переплетов, которые получают переопределяются Module я обеспечиваю за исключением. Это возможно?Guice переопределить некоторые привязки в существующем инжекторе

Я знаю около Modules.override, но это не принимает Injector как аргумент. Если бы можно было преобразовать Injector в Module, это решило бы мою проблему.

ответ

1

Самый простой способ думать об этом было бы через child injectors, но это explicitly disallowed as a design decision:

Причина переопределение привязки в детском инжектором не поддерживается, потому что это может привести разработчик в сторону написания кода которые могут работать либо у родителя & ребенка-инжектора, но по-разному в каждом. Это может привести к очень неожиданным сценариям из-за привязок точно и точно (JIT) и способа взаимодействия с родительскими/дочерними инжекторами.

На данный момент, я бы, наверное, думаете о реструктуризации вашего приложения, чтобы избежать требующих этих сложных привязок, но если вы хотите пойти дальше, вы можете, вероятно, использовать Injector.getBindings() или Injector.getAllBindings() (обратите внимание на разницу!) И сшейте их обратно в модуль с использованием Elements SPI. В конце концов, Binding<?> расширяет Element, а Elements.getModule(...) создаст модуль из ваших элементов. Я не проверял, что это работает, но это, наверное, ваше лучшее лидерство.

+0

Спасибо за подсказку. Я дам ему попробовать. Один комментарий: я не думаю, что OP использовал «сложные привязки». То, что он описывал, было именно тем, что можно было бы сделать в модульном тесте. Тестирование модулей наиболее эффективно, когда вы можете выборочно переопределять части вашей системы. То есть вы хотели бы привязки по умолчанию на месте и простой механизм для переопределения одного или двух во время выполнения. Это стандартная TDD. Я новичок в Guice, и, может быть, я чего-то не хватает. Однако я вижу, что многие разработчики задают похожие вопросы, и я разочарован тем, что Guis не делает эту простую функциональность доступной. – EJK

+1

@EJK 'Modules.override' - это конкретный и лучший способ переопределить для модульного тестирования, если вам нужно вводить единичный тест, и мой сложный ответ был в ответ на общий характер вопроса и конкретное избегание 'Modules.override'. Переопределение инжектора вместо модуля - это похоже на то, чтобы сделать омлет из безе, а не из яиц - необработанный вход дает лучшие результаты. –

+0

Спасибо за разъяснение. Теперь я вижу ваш момент. Я бы хотел, чтобы документы Guice/RoboGuice были более понятны. Кажется, в этой теме очень много путаницы. – EJK

Смежные вопросы