Где хранить форсунки? - PullRequest
       6

Где хранить форсунки?

4 голосов
/ 01 февраля 2010

Какой ваш совет?

Я нашел наиболее подходящее для меня решение - держать инжекторы и модули в классах перечисления. Преимущества:

  1. форсунки и модули, созданные один раз,
  2. инжекторы могут использоваться из разных классов при запуске приложения (не только при начальной загрузке),
  3. форсунки хранятся в одном месте и их легко найти.

Пример:

import static ru.package.Modules.*;

public enum Injectors {

FOO_INJECTOR(BarModule.module()),

FOO2_INJECTOR(FOO_INJECTOR.injector(),
        Bar2Module.module(), FooModule.module());

private final Injector m_injector;

Injectors (Module... modules) {
    m_injector = Guice.createInjector(modules);
}

Injectors (Injector parentInjector, Module... modules) {
    m_injector = parentInjector.createChildInjector(modules);
}

public Injector injector() {
    return m_injector;
}
}

Ответы [ 2 ]

16 голосов
/ 01 февраля 2010

Похоже, вы в корне не понимаете, как работает внедрение зависимостей. Если вы пытаетесь использовать ссылку на Injector где-либо в вашем коде, кроме места, где вы загружаете приложение, вы не используете внедрение зависимостей, вместо этого вы используете его в качестве локатора службы. Вы вынуждены готовить Injector всякий раз, когда вам нужно протестировать класс, и ваши классы не дают понять в своих конструкторах, каковы их зависимости (поскольку кто знает, что они получат из Injector в некоторых метод, если они имеют или могут получить ссылку на него). На самом деле, использование enum, как вы описали здесь, еще хуже: вы вообще не можете изменить конфигурацию, даже для тестирования, потому что ваши модули жестко закодированы в enum.

С внедрением зависимостей классы объявляют только свои зависимости и позволяют Injector, работающему прозрачно (после первоначального вызова получить корневой объект приложения), предоставить все эти зависимости. Это делает понимание, тестирование и изменение функциональности вашего кода относительно простым. В любом случае, я бы посоветовал узнать больше о том, как DI и Guice предназначены для использования ... вы действительно не должны этого делать.

5 голосов
/ 01 февраля 2010

Большой вопрос, почему?

Не должно быть необходимости держать Injector рядом, потому что после инъекции Injector должно быть сделано и должно исчезнуть.

Если, однако, вам действительно нужен Injector, не могли бы вы просто:

@Inject
private Injector injector;

Это веб-приложение или оно автономное?

...