3

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

リスナーとの関係については、ホワイトボード パターンを使用します。これは、IMHO の意見が最良のアプローチです。ただし、通知以上のものが必要な場合は、3 つの解決策が考えられます。

次のシナリオを想像してください。

interface IDatabaseService {
  EntityManager getEntityManager();
}

[1] ホワイトボードパターン - セルフ設定サービス付き

新しいサービス インターフェイスを作成します。

interface IDatabaseServiceConsumer {
  setDatabaseService(IDatabaseService service);
}

このようなbindConsumerメソッドを使用して宣言型の IDatabaseService コンポーネントを作成します

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] クラスをサービスにする

みたいなクラスをイメージ

public class DatabaseEntryViewer は TableViewer を拡張します

ここで、IDatabaseService のバインド/バインド解除メソッドを追加し、component.xml を追加して、DatabaseEntryViewer を追加するだけです。このアプローチでは、引数のないコンストラクターがあり、OSGi-Service-Factory を介して UI コンポーネントを作成することを前提としています。

[3] 従来の方法: ServiceTracker

Activator に静的な ServiceTracker を登録してアクセスする従来の方法。トラッカーを使用するクラスは、ダイナミックを処理する必要があります。

現在、私は最初のアプローチを支持しています。このアプローチはオブジェクトの作成を複雑にせず、Activator を無限の静的な ServiceTracker から保存するからです。

4

1 に答える 1

2

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

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

番号 3 は単純なオプションであり、必ずしも最良とは限りませんが単純です。

Spring DMを使用すると、2 番を簡単に実現できます。サービス Bean を UI ビュー、ページなどに注入する手段を提供します。Spring ファクトリを使用してビューを作成します (plugin.xml で定義)。これは、サービスを Bean に注入できる Spring 構成を介して構成されます。

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

于 2011-10-31T17:35:15.893 に答える