2014-02-20 129 views
0

所以,我们有一个供应商永远不会超过50(我们现在大概是20)的每个供应商的属性文件。每个有大约20个物业左右。注入与guice不同的实例

我们希望VendorStream的每个实例(以及他的所有子项)都注入特定供应商的全套属性。每个人都使用VendorStream,但具有不同的属性数组。

是否有一个干净的方式来做到这一点与guice或我们必须有一个模块每个供应商,我们真的不想要,因为我们不需要20个模块。

感谢, 院长

回答

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)); 
    } 
    } 
} 
... 
+0

东西不是太清楚我这里来。在我的VendorStream.java和VendorStreamChild.java中,我将@Inject放在一个字段上,但他的属性需要改变......我想我只能用多个模块来做到这一点,这看起来很丑陋。 –

+0

院长,复杂性不会仅仅通过使用一些很酷的性感技术而消失。如果你的财产需要改变,你没有别的选择。我认为重新使用具有高级别绑定封装的私有模块是一种纯粹的卓越。如果您希望我帮助您进一步发送电子邮件并分享源代码。根据我对你的问题的想象很难解释。 –