私は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を保存するので、私は最初のものを好んでいます。
IDatabaseServiceをIDatabaseServiceConsumerに「注入」(バインド)していないのはなぜですか? –
こんにちはIvan、現在、私たちはSpring DIやGoogleのジュースのようなDIフレームワークを使用していません。それはEclipse RCP開発の難しい方法ですか? – Muki
あなたは実際に何を達成したいかについて何も言わなかった。 3つのアプローチはすべて有効かもしれませんが、コンテキストがないので何が最善であるかを言うことは不可能です。 –