我開始越來越熱愛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中保存下來。
不明白,爲什麼你不是「注入」(綁定)IDatabaseService到IDatabaseServiceConsumer? –
嗨伊凡,目前我們沒有使用任何DI框架,如Spring DI或Google juice。這對Eclipse RCP開發來說很難嗎? – Muki
你還沒有說出你實際想要達成的目標。所有這三種方法都可能是有效的,但不可能說什麼是最好的,因爲沒有上下文。 –