2017-02-21 32 views
1

我最近在.NET中編寫了7年的代碼之後開始使用Java,不要誤解我的愛C#,但是工作需要,我需要改變。我的問題是關於Ioc註冊,在C#中我用Windsor和SimpleInjector(我完全喜歡),在java中我想開始使用Guice。Auto使用Guice綁定所有的`Services`

我正在從事的項目是一個遺留項目,不會使用Ioc,這是澤西島項目(與非功能HK2 IOC)。

現在對於我的問題,在C#上我註冊了所有接口和具體實現應用程序啓動運行時使用反射。

我已閱讀Guice文檔,找不到任何示例來執行此操作,並且JIT綁定尚未真正理解。

那麼有可能這樣做嗎?這是最佳做法嗎? (我不認爲手工編寫所有綁定在正確的道路)

任何實例或方向將是非常有益

謝謝

+0

您是如何看待非功能性Hk2的。 Hk2功能非常強大... Hk2還有一個強大的自動服務註冊框架,使用@Service和ServiceLocator填充程序 – jwells131313

+0

@ jwells131313,我的意思是我們的系統中的HK2不可操作。 – guyl

回答

3

這是一個有點困難,在Java和吉斯做多在其他平臺上:Java classloader專爲finding classes by their package/name with fallbacks設計,而不是枚舉類路徑中的每個類或實現。儘管在規定的條件下(如ReflectionsGoogle Guava)存在一些庫方案來處理後者,但通過遍歷當前類加載器及其父類的每個類迭代通常是不可能的,因爲通過URLClassLoader和類似的基於網絡的類加載器,理論上該集合是無限的。

這使得通常和經常需要明確列出您的接口和實現以暴露給您的應用程序,無論您是否使用Guice。

參見:

因此,很難雖然通過Guice SPI你可能有更多的成就,如 「開始實現MyStartableService每個可到達班」,任務祝你好運「開始每個通過Guice請求的MyStartableService,然後再返回」。或者,您也可以使用內置於Java 6中的Java SPI framework(例如ServiceLoader)來允許合適服務的分片或分佈式列表,然後可以通過調用模塊中的bind將其提供給Guice。 (Olivier在評論中恰當地建議AutoService,這使得生成支持ServiceLoader的元數據文件變得非常容易。)

+1

如果採用SPI框架方式,請嘗試使用Google的[AutoService](https://github.com/google/auto/tree/master/service):這是一種挽救生命的方式: java文件,你只需添加一個小標註,一切都自動完成。 –

+0

感謝您的詳細解答, 我會盡力瞭解如何採取行動 – guyl