在我們正在開發的應用程序中,我有一個用於實現數據提供程序組件的通用接口,並且我將這些提供程序掛接爲服務。OSGi應用程序設計 - 我濫用服務框架嗎?
我的一位同事建議,創建一個服務可以跟蹤這些實現(當前有多少可用,並可能通過獲取器使其可用於代碼庫的其他部分),我們可以使用實現包的激活器註冊/註銷它們。
雖然這通常可以工作,但這(幾乎)正是服務層提供的內容,對我而言,感覺就像我們複製了功能。
您認爲如何?
在我們正在開發的應用程序中,我有一個用於實現數據提供程序組件的通用接口,並且我將這些提供程序掛接爲服務。OSGi應用程序設計 - 我濫用服務框架嗎?
我的一位同事建議,創建一個服務可以跟蹤這些實現(當前有多少可用,並可能通過獲取器使其可用於代碼庫的其他部分),我們可以使用實現包的激活器註冊/註銷它們。
雖然這通常可以工作,但這(幾乎)正是服務層提供的內容,對我而言,感覺就像我們複製了功能。
您認爲如何?
這將是複製功能。您管理其他服務的服務將成爲服務註冊表。
您現在有任何依賴於您的數據提供者的服務也依賴於您的服務管理器,只有這樣他們才能執行查找以獲得他們想要的實際服務。
更好地簡單地將實際所需的依賴項注入到實際需要的代碼中,並且有許多工具(DS,Spring DM,Blueprint ...)將基於規範中定義的功能提供此功能。也就是服務註冊表。
更新:如果你正在做動態加載,就像你暗示的那樣,那麼OSGi已經爲此提供了一個ServiceListener,並且消費者需要知道這種性質並進行了適當的編碼。上述工具也處理這些情況。
您可以檢查頁面如下:HTTP://www.ibm.com/developerworks/websphere/techjournal/1007_charters/1007_charters.html
希望這幫助你
您的使用情況服務註冊表的主要OSGi用例之一。服務註冊表主要用於這種應用程序,您需要在未耦合模塊之間共享實例。
使用Service Registry你:
的OSGi的主要目的一直是他人使用,有助於服務獨立的模塊,例如黑板編程模型。這提供了一個非常優雅的點對點解耦編程模型。全班加載戰爭總是掩蓋了這一方面。
祝願所有JDK的東西如JNDI,JDBC,XML解析器,JAXB插件,安全提供程序,JPA等都已實現單個服務存儲庫的頂部。 – 2012-03-02 17:20:54
大多數人不知道如果我們刪除所有具有服務的工廠,可以簡化多少Java :-(-) – 2012-03-05 08:59:32
這是不必要的重複,因爲你不想從OSGi框架中解耦你的代碼。正如你和羅賓所說的那樣,你將會重新實施與服務註冊相關的方式。使用org.osgi.util.tracker.ServiceTracker/ServiceTrackerCustomizer會優雅地爲您提供「跟蹤」 – earcam 2012-02-28 13:51:43