使用guice注入不同的实例

时间:2014-02-20 16:55:43

标签: guice guice-3

所以,我们有一个每个供应商的属性文件,供应商永远不会真正超过50(我们现在可能在20左右)。每个都有大约20个属性左右。

我们希望为VendorStream的每个实例(和他的所有孩子)注入特定供应商的全新属性集。每个人都使用VendorStream但具有不同的属性数组。

使用guice是否有一个干净的方法,或者我们必须为每个供应商提供一个我们真正不想要的模块,因为我们不需要20个模块。

感谢, 迪安

1 个答案:

答案 0 :(得分:0)

我会这样做的!

我会创建ParentModul,它会扫描供应商配置的预定义文件夹,并为找到的每个供应商配置安装Private module。私有模块封装了来自其他模块的绑定,因此,您可以将配置中的属性绑定为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));
    }
  }
}
...