2015-05-13 60 views
-1

我正在使用Guice,我處於一種情況,在這種情況下,我需要根據某個參數獲得給定接口的特定實現。與setter/controller注入不同,我會在方法中請求實例,只有在調用方法時才知道參數的值。獲取一個特定的實現實例,基於參數

我可以解決我的問題,使用經典的工廠對象並注入工廠實例,我通常會注入實現實例本身。我檢查了Guice的提供者,一開始看起來很有希望,但似乎無法將參數傳遞給get()方法。

這是你如何解決這個問題?

回答

0

吉斯對於第一種方法提供工廠幫手叫Assisted Inject

但是,有可能與Custom scopes做得更好。

這個想法是seed對象注入依賴於提供者的參數。

它看起來像:

模塊:

bind(CommandProperty.class).toProvider(ExchangeScope.<CommandProperty>seededKeyProvider()).in(ExchangeScope.class); //<< this is missing in tutorial 

作用域代碼:

scope.enter(); 
try { 
    // explicitly seed some seed objects... 
    scope.seed(Key.get(CommandProperty.class), commandPropertyInstance); 

    // create and access scoped objects 
    runnable.run(); 

} finally { 
    scope.exit(); 
} 

提供者:

private Provider<CommandProperty> commandPropertyProvider; 
    private Map<CommandProperty, Provider<Object>> objectProviderMap; 

    @Inject 
    public ObjectProvider(Provider<CommandProperty> commandPropertyProvider, Map<CommandProperty, Provider<Object>> objectProviderMap) { 
    this.commandPropertyProvider = commandPropertyProvider; 
    this.objectProviderMap = objectProviderMap; 
    } 

    @Override 
    public CommandProperty get() { 
    CommandProperty commandP = commandPropertyProvider.get(); 
    return objectProviderMap.get(commandP).get(); 
    } 

正如你可以看到objectProviderMap會在運行時期間可以注入。不同的是你擺脫了工廠,你可以創建對象的構造/設置方式。垮臺是你必須維護更大的代碼複雜性。我寧願使用它的代碼庫而不是應用程序級別的核心或框架。

+0

我想避免將我的課程介紹給提供者的概念(如果可能) – preslavrachev

+0

那麼,我無法想象如何去做。工廠是唯一的選擇。 –