Как правильно настроить свойства с помощью Guice? - PullRequest
1 голос
/ 28 декабря 2010

Предположим, у нас есть 2 класса - Main и MainDependency. Второй класс используется только Main, и целью использования IoC является создание экземпляра класса Main.

MainDependency класс имеет поле целочисленного типа. Это поле не обязательно устанавливать (или, допустим, оно всегда должно иметь значение по умолчанию, если ничего не указано).

Проблема: как правильно задать целочисленное поле? Один из способов, который я вижу, - создать подобное поле внутри моего Module и затем использовать это значение внутри модуля configure Но я чувствую, что это неправильный путь.

Пожалуйста, поделитесь своим опытом. Спасибо заранее.

1 Ответ

2 голосов
/ 28 декабря 2010

Я думаю, что в основном у вас есть два варианта:

1) Внедрить его, используя постоянное связывание.Значение MY_CONSTANT может быть передано Module во время создания экземпляра;может быть взято из системного свойства, или, может быть, другим способом.

class MainDependency{
  @Inject
  public MainDependency(@Named("myConst") int myConst){
    //...
  }
}

class Module extends AbstractModule{
  public void configure(){
    bindConstant().annotatedWith(Names.named("myConst").to(MY_CONSTANT);
  }
}

2) Используйте Assisted Inject для создания фабрики, которая будет принимать ваше значение в качестве параметра и возвращать экземпляр MainDependency:

interface MainDependencyFactory{
  MainDependency create(int myConst);
}

class MainDependency{
  @Inject
  public MainDependency(@Assisted int myConst){
    //..
  }
}

class Module extends AbstractModule{
  public void configure(){
    bind(MainDependencyFactory.class).toProvider(
      FactoryProvider.newFactory(MainDependencyFactory.class, MainDependency.class));
  }
}

//to use the above, instantiate your factory (or inject it somewhere)
MainDependencyFactory f = injector.getInstance(MainDependencyFactory.class);
//Then you can create MainDependency with any value
MainDependency md = f.create(MY_CONSTANT);

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

...