2010-02-01 1 views
4

Каков ваш совет?Куда хранить липкие форсунки?

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

  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; 
} 
} 
+8

Не делайте этого. У этой стратегии много проблем. В каждом исполнении вашей программы все ваши инжекторы будут созданы независимо от того, нужны они или нет. –

ответ

5

Чем больше вопрос, почему?

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

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

@Inject 
private Injector injector; 

Является ли это веб-приложение на основе или это автономные?

+0

Этот код также используется в сети, но не только. Об инжекции инжектора я задал уже вопрос: http://stackoverflow.com/questions/2176216/how-to-inject-injector. Проблема заключается в том, что гусь не позволяет связывать или обеспечивать инжектор. –

+0

Я должен согласиться с ColinD, может быть полезно понять, как работает DI. Это позволит вам сэкономить много времени и усилий :) – gpampara

16

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

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

+0

Я новичок в DI и Guice, поэтому plz терпеливо) 1) Он используется в веб-приложении, поэтому мне нужно выделять объекты со всем графиком зависимостей во время выполнения, не только при загрузке. 2) Enum. Вы не должны изменять модули каждый раз, когда хотите протестировать. Для тестирования вы можете настроить отдельные модули и форсунки (если это необходимо). 3) И почему я должен использовать инжектор только для корневых объектов? Как насчет, например, АОП? –

+0

@ColinD У меня аналогичная потребность в инжекторе, потому что мне не нужно делать DI во время построения, но также хотелось бы иметь возможность доступа к экземплярам Singleton во время выполнения (через Beanshell для целей отладки и т. Д.). Другими словами, мне нужен какой-то реестр для одиночек. Теперь, без DI, мы обычно использовали статическое конечное поле для его хранения, но теперь с Guice DI инжектор, по-видимому, является естественным выбором для реестра. – RAY

+0

Рассмотрите устаревшие приложения, в которых может оказаться неприемлемым применение инъекции зависимостей на графике зависимостей сразу же. По мере того, как вы постепенно вводите инъекцию в зависимости, вы в конечном итоге используете некоторые варианты использования инжектора в качестве локатора сервисов, стратегически размещенного. – beluchin

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

  • Нет связанных вопросов^_^