2011-10-27 13 views
3

私はOSGiサービスを愛するようになり、サービスとして多くのコンポーネントを実現したいと考えています。今、私はベストプラクティス、特にUIコンポーネントを探しています。OSGiサービス - ベストプラクティス

リスナーとの関係では、私はホワイトボードパターンを使用しますが、これはIMHOの意見が最善の方法です。しかし、単に通知以上のものを望むなら、私は3つの可能な解決策を考えることができます。

次のシナリオを想像:

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が1つしかないことを前提としています。

[更新]使い方は次のようになります。

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を登録し、それをアクセスするための古典的な方法。トラッカーを使用するクラスは動的を処理する必要があります。

現在のところ、このアプローチは複雑なオブジェクトの作成ではなく、無限で静的なServiceTrackersからActivatorを保存するので、私は最初のものを好んでいます。

+0

IDatabaseServiceをIDatabaseServiceConsumerに「注入」(バインド)していないのはなぜですか? –

+0

こんにちはIvan、現在、私たちはSpring DIやGoogleのジュースのようなDIフレームワークを使用していません。それはEclipse RCP開発の難しい方法ですか? – Muki

+0

あなたは実際に何を達成したいかについて何も言わなかった。 3つのアプローチはすべて有効かもしれませんが、コンテキストがないので何が最善であるかを言うことは不可能です。 –

答えて

2

@Neil Bartlettに同意する必要があります。オプション1は後方です。 Observer/Observableパターンを使用しています。

RCPでUIオブジェクトライフサイクルを管理する方法では、あなたが望むことをすることができないため、数字2は機能しません。ウィジェットは、ある種のビューコンテナ(ViewPart、Dialog、...)の初期化の一部として作成する必要があります。このビュー・パーツは、通常、Workbench /プラグイン・メカニズムを介して構成および管理されます。これではなく、これで作業する必要があります。

数字3は単純なオプションであり、必ずしも最高ではなく単純です。

Spring DMを使用すると、簡単に2を達成できます。これは、あなたのUIビュー、ページなどにサービスBeanを注入する手段を提供します。あなたはSpringの設定を使って設定されたビューを(あなたのplugin.xmlで定義されているように) Beanへのあなたのサービス。

SpringExtensionFactoryクラスで使用される手法とDIを組み合わせて、別のテクノロジを導入することなく、同じことを達成することもできます。私はそれを自分で試していないので難しさについてはコメントできませんが、Spring DMをまだ使用していない場合は、RCPとOSGiのギャップを埋めるために何をしようとします。

関連する問題