2012-02-27 57 views
4

在我們正在開發的應用程序中,我有一個用於實現數據提供程序組件的通用接口,並且我將這些提供程序掛接爲服務。OSGi應用程序設計 - 我濫用服務框架嗎?

我的一位同事建議,創建一個服務可以跟蹤這些實現(當前有多少可用,並可能通過獲取器使其可用於代碼庫的其他部分),我們可以使用實現包的激活器註冊/註銷它們。

雖然這通常可以工作,但這(幾乎)正是服務層提供的內容,對我而言,感覺就像我們複製了功能。

您認爲如何?

+1

這是不必要的重複,因爲你不想從OSGi框架中解耦你的代碼。正如你和羅賓所說的那樣,你將會重新實施與服務註冊相關的方式。使用org.osgi.util.tracker.ServiceTracker/ServiceTrackerCustomizer會優雅地爲您提供「跟蹤」 – earcam 2012-02-28 13:51:43

回答

5

這將是複製功能。您管理其他服務的服務將成爲服務註冊表。

您現在有任何依賴於您的數據提供者的服務也依賴於您的服務管理器,只有這樣他們才能執行查找以獲得他們想要的實際服務。

更好地簡單地將實際所需的依賴項注入到實際需要的代碼中,並且有許多工具(DS,Spring DM,Blueprint ...)將基於規範中定義的功能提供此功能。也就是服務註冊表。

更新:如果你正在做動態加載,就像你暗示的那樣,那麼OSGi已經爲此提供了一個ServiceListener,並且消費者需要知道這種性質並進行了適當的編碼。上述工具也處理這些情況。

0

您可以檢查頁面如下:HTTP://www.ibm.com/developerworks/websphere/techjournal/1007_charters/1007_charters.html

希望這幫助你

12

您的使用情況服務註冊表的主要OSGi用例之一。服務註冊表主要用於這種應用程序,您需要在未耦合模塊之間共享實例。

使用Service Registry你:

  1. 工具,比如聲明式服務或藍圖,讓你不夫婦到OSGi的API
  2. 三項賽
  3. 自省
  4. 併發
  5. 任意模塊無需中央配置更改即可爲游泳池作出貢獻
  6. 可選功能,帶有強大的fi濾波器(運行時配置與DS)
  7. 可調試與現有炮彈
  8. 標準化

的OSGi的主要目的一直是他人使用,有助於服務獨立的模塊,例如黑板編程模型。這提供了一個非常優雅的點對點解耦編程模型。全班加載戰爭總是掩蓋了這一方面。

+0

祝願所有JDK的東西如JNDI,JDBC,XML解析器,JAXB插件,安全提供程序,JPA等都已實現單個服務存儲庫的頂部。 – 2012-03-02 17:20:54

+0

大多數人不知道如果我們刪除所有具有服務的工廠,可以簡化多少Java :-(-) – 2012-03-05 08:59:32