Guice Injection через модули для совместного использования - PullRequest
2 голосов
/ 20 июня 2010

У меня есть три модуля в Guice:

  • ReflectionsModule, для предоставления метаданных (посредством отражений)
  • PersistenceModule, для объектов доступа к данным и других
  • WebModule,для Web Stuff

Проще говоря, и PersistenceModule, и WebModule извлекают объект, созданный из модуля Reflections.Я не могу найти очень дружелюбный способ сделать это в обличье.

Я думаю, что PrivateModules будут подходящим способом, но я не уверен, как это реализовать.Есть идеи?

Спасибо.

Некоторые дополнительные детали

Я использую Reflections.Это в основном оболочка для загрузки метаданных постоянства из статического ресурса.Таким образом, в основном предполагается, что разобранный файл XML в JavaBean.Вот что касается ReflectionsModule.

Из этих метаданных в javabean мне нужно настроить постоянство (его приложение Google App Engine, использующее Objectify) и загрузить дополнительные классы и связать их при чтении некоторых аннотаций внутри.Я не хочу загружать ресурс, поэтому я хотел бы сослаться на ресурс, загруженный из первого примера.

На данный момент ReflectionsModule также связывает два последующих модуля, которые я получаю (правильно) ипримените их к createChildInjector, который пришел при сборке только с первым модулем.Как и сейчас, это работает.Я просто хотел бы знать, какой путь будет лучшим.

Ответы [ 2 ]

2 голосов
/ 28 июля 2012

РЕДАКТИРОВАТЬ: лучший ответ найден: https://stackoverflow.com/a/5504903/105741 - в основном используйте аннотацию @Provides для получения параметров метода в вашем модуле, введенных с вашими зависимостями от других модулей. Работает намного приятнее. То есть для привязки, которая требует DependencyClass, я перемещаю этот код в метод, выставляю его с аннотацией @Provides и добавляю DependencyClass в качестве параметра метода.

@ Дайросс - я не думаю, что он спрашивает об этом.

Не рекомендуется создавать ReflectionModule более одного раза, и PrivateModules не имеют ничего общего с проблемой - делиться привязками с дочерними модулями (если я правильно его понимаю). У меня такая же потребность, и я использовал технику передачи требуемого объекта дочерним модулям, т.е.

Injector parentInjector = Guice.createInjector(new ParentModule());
DependencyClass dep = parentInjector.getInstance(DependencyClass);
injector = parentInjector.createChildInjector(new ChildModule(dep));

1010 * т.е. *

Injector reflectionsModule = Guice.createInjector(new ReflectionsModule());
DependencyClass dep = parentInjector.getInstance(DependencyClass);
injector = parentInjector.createChildInjector(
                              new PersistenceModule(dep), 
                              new WebModule(dep));

Не идеально, но служит цели.

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

2 голосов
/ 24 июня 2010

Проще говоря, PrivateModules предоставляют только те привязки, которые явно представлены с помощью аннотации @Exposed метода .expose ().Поэтому, если PersistenceModule и WebModule являются PrivateModules, вы можете сделать следующее:

public class WebModule extends PrivateModule {
  @Override
  public void configure() {
    install(new ReflectionsModule());
    // do stuff...
    expose(SomeClassFromWebModule.class);
  }
}

public class PersistenceModule extends PrivateModule {
  @Override
  public void configure() {
    install(new ReflectionsModule());
    // do stuff...
    expose(SomeClassFromPersitenceModule.class);
  }
}

Таким образом, привязки из ReflectionsModule не будут отображаться дальше, чем два PrivateModules, и поэтому не будут сталкиваться друг с другом.

Обычно рекомендуется выставлять только те классы, которые могут быть предоставлены только одним модулем.

...