所以,我们每个供应商都有一个属性文件,其中供应商永远不会超过 50 个(我们现在大概是 20 个)。每个都有大约20个属性左右。
我们希望为 VendorStream(以及他的所有孩子)的每个实例注入特定供应商的全新属性集。每个人都使用 VendorStream 但具有不同的属性数组。
有没有一种干净的方法可以用 guice 做到这一点,或者我们是否必须为每个供应商提供一个模块,这是我们真的不想要的,因为我们不想要 20 个模块。
谢谢,院长
我会这样做!
我将创建ParentModul
它将扫描供应商配置的预定义文件夹并Private module
为找到的每个供应商配置安装一个。私有模块封装了来自其他模块的绑定,因此您可以将配置中的属性绑定为constants
like @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));
}
}
}
...