2014-02-20 49 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

院長,複雜性不會僅僅通過使用一些很酷的性感技術而消失。如果你的財產需要改變,你沒有別的選擇。我認爲重新使用具有高級別綁定封裝的私有模塊是一種純粹的卓越。如果您希望我幫助您進一步發送電子郵件並分享源代碼。根據我對你的問題的想象很難解釋。 –