2011-10-27 290 views
3

我開始越來越熱愛OSGi服務,並希望將更多我的組件作爲服務實現。現在我正在尋找最佳做法,尤其是對於UI組件。OSGi服務 - 最佳實踐

對於聽者關係,我使用白板模式,恕我直言,意見是最好的方法。但是,如果我不僅需要通知,還可以考慮三種可能的解決方案。

試想以下情形:

interface IDatabaseService { 
    EntityManager getEntityManager(); 
} 

[1]白板模式 - 自設置服務

我將創建一個新的服務接口:

interface IDatabaseServiceConsumer { 
    setDatabaseService(IDatabaseService service); 
} 

,並創建一個聲明式IDatabaseService組件與bindConsumer這樣的方法

protected void bindConsumer(IDatabaseServiceConsumer consumer) { 
consumer.setDatabaseService(this); 
} 
protected void unbindConsumer(IDatabaseServiceConsumer consumer) { 
consumer.setDatabaseService(null); 
} 

此方法假定只有一個IDatabaseService。

[更新]用法是這樣的:

class MyUIClass ... { 

private IDatabaseService dbService; 

Consumer c = new IDatabaseServiceConsumer() { 
setDatabaseService(IDatabaseService service) { 
    dbService = service; 
} 
} 
Activator.registerService(IDatabaseServiceConsumer.class,c,null); 
... 
} 

[2]讓我的類服務

圖片喜歡

公共類DatabaseEntryViewer一類擴展的TableViewer

現在,我只是添加綁定/取消綁定方法fo我的IDatabaseService並添加一個component.xml並添加我的DatabaseEntryViewer。這種方法假設有一個非參數構造函數,並且我通過OSGi-Service-Factory創建UI組件。

[3]經典的方式:ServiceTracker的

經典的方式登記在我的激活和訪問靜態ServiceTracker的。使用跟蹤器的類必須處理動態。

目前我贊成第一個,因爲這種方法不會使對象創建變得複雜,並將Activator從無盡的靜態ServiceTracker中保存下來。

+0

不明白,爲什麼你不是「注入」(綁定)IDatabaseService到IDatabaseServiceConsumer? –

+0

嗨伊凡,目前我們沒有使用任何DI框架,如Spring DI或Google juice。這對Eclipse RCP開發來說很難嗎? – Muki

+0

你還沒有說出你實際想要達成的目標。所有這三種方法都可能是有效的,但不可能說什麼是最好的,因爲沒有上下文。 –

回答

2

我必須同意@尼爾巴特利特,你的選擇1是落後的。您實際上正在使用Observer/Observable模式。

由於UI對象生命週期在RCP中管理的方式不允許你做你想做的事,因此2號不會起作用。小部件必須作爲某種視圖容器(ViewPart,Dialog,...)初始化的一部分來創建。這個視圖部分通常通過Workbench /插件機制進行配置和管理。你應該與此合作,而不是反對它。

3號將是一個簡單的選項,不一定是最好的,但很簡單。

如果您使用Spring DM,那麼您可以輕鬆完成編號2。它提供了一種將服​​務bean注入到UI視圖,頁面等的方法。使用Spring工廠創建視圖(如plugin.xml中定義的),該視圖通過Spring配置進行配置,該配置能夠注入你的服務進入bean。

您也可以將SpringExtensionFactory類與DI一起使用的技術與DI完成相同的工作,而不需要引入其他技術。我沒有自己嘗試過,所以我不能評論這個難點,儘管如果我沒有使用Spring DM,我會盡力彌合RCP和OSGi之間的差距。