2012-01-09 45 views

回答

3

簡答題;第一個問題=否,第二個問題=否,沒有「解決方法」

「合同設計」原則發揮作用。基本上我們提供了一個消費者依賴和提供者實現的接口 - 這將我們的消費者代碼分解爲我們實現者的實現細節。請參閱http://www.osgi.org/blog/2011/08/package-as-contract.html以獲得良好的概述,並參閱http://en.wikipedia.org/wiki/Design_by_contract

考慮到我們希望使用的接口(API)和實現(API接口的具體實現)以及消費者(希望使用接口實現的代碼),對於OSGi,您有許多選項。

  1. 一個包可以同時提供接口和實現,但如果此服務被捆綁本身
  2. 具有接口(其中出口)一個獨立的包和其他的外部使用,必須導出界面(s) - 實現bundle必須導入接口的包,但不需要顯示他們自己的實現。

號2的優點包括允許多個提供商(OSGi的使用可被用來指定在註冊的服務的屬性的元數據匹配的LDAP過濾器),並利用OSGi的的動態結合性質(即可以改變實施運行時提供者)。

需要注意的一點是,使用者和提供者必須使用與包版本和導出包所定義的相同的類(換句話說,加載API類的包類加載器對於消費者而言必須是相同的和提供者)。

1

服務的類型應該在導出的包中。服務是鍵入的,並建立在模塊層的類型共享上。所以你需要確保服務的提供者和服務的使用者都可以共享相同的類型。所以一些bundle必須導出包含該類型的包,以便提供者和消費者可以導入該包。這允許框架驗證服務的類型安全性。