2014-02-20 2 views
0

Итак, у нас есть файл свойств для каждого поставщика, где поставщики никогда не превысят 50 (сейчас около 20, может быть, сейчас). Каждый из них имеет около 20 свойств или около того.инъекции разных разных экземпляров с guice

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

Есть ли чистый способ сделать это с помощью guice или у нас должен быть модуль на одного поставщика, которого мы действительно не хотим, так как нам не нужны 20 модулей.

спасибо, Дин

ответ

0

Я хотел бы сделать это так!

Я бы создал ParentModul, который сканировал бы предопределенную папку для конфигураций поставщиков и установил Private module для каждой найденной конфигурации поставщика. Частный модуль инкапсулирует привязку из других модулей, поэтому вы можете привязать свои свойства от config как constants, например @Named("vendor_name") String vendorName.

Посмотрите на эту презентацию, это может дать вам лучшее объяснение того, как использовать свойство частного модуля. Существует также пример github. http://slid.es/milanbaran/dec

Есть некоторые фрагменты:

Родитель Модуль:

protected void loadVendorModules(String config) { 
File configDir = new File(config); 
if(!configDir.exists()) { 
    addError("Configuration directory [%s] doesn't exist. Also, it should contain broker definition files. [broker*.yml]",config); 
} 
if(!configDir.isDirectory()) { 
    addError("The `dir.config` parameter is supposed to be a directory. Actually it is not %s",config); 
} 
broker_files = new File(config).listFiles(new PatternFilenameFilter(FILE_PATTERN)); 
if(broker_files==null || broker_files.length==0) { 
    addError("Configuration directory [%s] doesn't contain any broker definition files, please add at least one to start.",config); 
} 
for(File f : broker_files) { 
    install(new VendorPrivateModule<T>(f.getAbsolutePath())); 
} 
return; 

}

Производитель Частный Модуль:

protected void configure() { 
.... 
if(config.getConfig()!=null) { 
    for(String name : config.getConfig().keySet()) { 
    String value = config.getConfig().get(name); 
    if(value!=null) { 
     bind(Key.get(String.class, Names.named(name))) 
      .toInstance(value); 
    } else { 
     bind(Key.get(String.class, Names.named(name))) 
      .toProvider(Providers.of((String) null)); 
    } 
    } 
} 
... 
+0

что-то не слишком ясно, здесь для меня. В моей VendorStream.java и моей VendorStreamChild.java у меня было бы @Inject в поле, но его свойство должно меняться ... Думаю, я могу сделать это только с несколькими модулями, которые казались уродливыми. –

+0

Дин, сложность не исчезнет, ​​просто используя некоторые классные сексуальные технологии. Если ваша собственность нуждается в изменении, у вас нет другого выбора. Я думаю, что повторное использование частных модулей с высоким уровнем инкапсуляции привязки - это чистое превосходство. Если вы хотите, чтобы я помог вам отправить мне электронное письмо и поделиться исходным кодом. Трудно объяснить мое воображение вашей проблемы. –

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