2013-07-16 120 views

回答

1

實現需要根據輸入而有所不同,在某些時候,您將不得不將輸入解析爲某種類。

如果你想讓這個映射生活在Guice中,那麼你基本上得到一個基於參數的實現,映射到the SO question I just answered here。您可以編寫一個小型注入類,它接受輸入並返回一個完全注入的實現。

如果你已經有一個映射,並有(例如)一類的文字在一個變量,那麼你可以inject an Injector directly並請它替實施。

class YourClass { 
    @Inject Injector injector; 

    SomeInterface yourMethod(String input) { 
    Class<? extends SomeInterface> clazz = getClassLiteralFromInput(input); 
    return injector.getInstance(clazz); 
    } 

    Class<? extends SomeInterface> getClassLiteralFromInput(String input) { 
    // Implement this as needed. 
    return SomeInstance.class; 
    } 
} 

請注意,雖然你總是可以注入的注射器,你應該只這樣做的時候,你真的不知道你需要什麼樣的執行情況(喜歡這裏)。一般而言,如果您想延遲創建,您應該注入SomeInstance本身或Provider<SomeInstance>

0

我們有類似的要求一次,所以我們所做的就是使用工廠模式,並使用彈簧加全部實現工廠類實現。

這種方式,當運行時我們會知道使用哪個實現,我們會打電話給我的工廠來提供實現類。另外,無論何時你有更多的實現,你都可以更新工廠類的彈簧組態。

這可能不符合您的設計要求,但這解決了我們的目的。

乾杯!