Как привязать строку к переменной в Guice?

Для решения этой проблемы существует модуль с именем File :: ShareDir . Вы были на правильном пути, пытаясь найти FindBin, но FindBin всегда находит запущенную программу , а не модуль, который ее использует. ShareDir делает что-то очень похожее на решение ysth, за исключением завершенного в приятном интерфейсе.

Использование так же просто, как

my $filename = File::ShareDir::module_file(__PACKAGE__,
  'my/data.txt');
# and then open $filename or whatever else.

или

my $dirname = File::ShareDir::module_dir(__PACKAGE__);
# Play ball!

21
задан mkobit 9 October 2016 в 20:31
поделиться

2 ответа

Сначала вам нужно аннотировать конструктор для SomeClass :

class SomeClass {
  @Inject
  SomeClass(@Named("JDBC URL") String jdbcUrl) {
    this.jdbcUrl = jdbcUrl;
  }
}

Я предпочитаю использовать пользовательские аннотации, например:

class SomeClass {
  @Inject
  SomeClass(@JdbcUrl String jdbcUrl) {
    this.jdbcUrl = jdbcUrl;
  }

  @Retention(RetentionPolicy.RUNTIME)
  @Target({ElementType.FIELD, ElementType.PARAMETER})
  @BindingAnnotation
  public @interface JdbcUrl {}
}

Затем вам нужно предоставить привязку в ваш модуль:

public class SomeModule extends AbstractModule {
  private final String jdbcUrl; // set in constructor

  protected void configure() {
    bindConstant().annotatedWith(SomeClass.JdbcUrl.class).to(jdbcUrl);
  }
}

Затем, когда Guice создает SomeClass, он вводит параметр. Например, если SomeOtherClass зависит от SomeClass:

class SomeOtherClass {
  @Inject
  SomeOtherClass(SomeClass someClass) {
    this.someClass = someClass;
  }

Часто, когда вы думаете, что хотите ввести String, вы хотите внедрить объект. Например, если String является URL-адресом, я часто вставляю URI с аннотацией привязки.

Все это предполагает наличие некоторого постоянного значения, которое вы можете определить во время создания модуля для String. Если значение недоступно во время создания модуля, вы можете использовать AssistedInject .

42
ответ дан 29 November 2019 в 06:35
поделиться

Я нахожу решение в разделе часто задаваемых вопросов Guice:

http://code.google.com/docreader/#p=google-guice&s=google-guice&t=FrequentlyAskedQuestions

В дополнение к определению аннотации и атрибута String в MyModule, мне нужно написать строку ниже, чтобы получить экземпляр SomeClass:

SomeClass instance = Guice.createInjector(new MyModule("any string i like to use")).getInstance(SomeClass.class);

Но я вспомнил этот Инжектор. getInstance () не должен использоваться, кроме корневого объекта, так есть ли лучший способ сделать это?

0
ответ дан mkobit 9 October 2016 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: