2015-03-14 3 views
-1

Моя проблема здесь; Я не знаю, могу ли я сделать это с помощью:Может ли guice разрешить встраивание членов в конструктор?

* Бар будет введен правильно или нет? Спасибо

+0

Вы пробовали? Каков был результат? –

+0

Проблема в том, что я не могу попробовать, я сейчас строю большую DSL, и мне нужен ответ быстро! –

+0

Я просто хочу знать, работает ли этот код или нет. –

ответ

3

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

, вероятно, лучшая альтернатива для того же эффекта будет:

@Inject Foo(Provider<Bar> barProvider) { 
    this.bar = barProvider.get(); 
} 

Поскольку это приведет к Guice сконструировать экземпляр Bar и ввести свои поля.

Как и в сторону, этот пример демонстрирует некоторые плохие практики:

  • Это плохая форма, чтобы сделать @Inject конструкторами public. Весь смысл инъекции зависимостей состоит в том, чтобы сделать так, чтобы клиентам вашего класса не нужно было знать о зависимостях вашего класса. Это подорвано, если они когда-либо создавали класс напрямую. Если вы действительно хотите конструктор по умолчанию, просто укажите конструктор не @Inject или фабричный метод (либо в классе, либо в другом месте в пакете).
  • injectMembers обычно лучше избегать, если это возможно. По возможности предпочитайте инъекцию конструктора. В частности, это необходимо, если вы собираетесь делиться экземплярами по потокам, так как injectMembers может не гарантировать безопасную публикацию. Как и любой шаг инициализации пост-конструктора, он также затрудняет определение инвариантов классов.
  • Как вы, вероятно, предположили, инъекция Injector является запахом кода. Вне действительно тяжелого метапрограммирования или кода рамки, он почти никогда не понадобится. Подобно отражению, это может быть отличным способом создания «волшебной» функциональности, но также и отражения, это может также вызвать чрезвычайно странные ошибки времени выполнения, если вы сделаете это неправильно.
+0

Спасибо. Но мой пример - это не моя ситуация. Мне действительно нужно ввести поле, которое не может быть создано провайдером. –

+0

Большое вам спасибо! –

+0

@ Romain-p: почему вы не можете использовать «Провайдер» здесь? Можете ли вы предоставить больше кода, чтобы продемонстрировать, что происходит? Могут быть и другие методы (например, возможно, вы можете расширить связывание DSL с помощью собственных методов построения привязок), что сделало бы этот подход менее хрупким. –

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