0

存在するバンドルを想像してみましょう:

  • コンポーネントは、サービス レジストリ内のすべての「デバイス」サービス インスタンスをリッスンする役割を果たします。

  • 検出されたデバイスを使用して「アダプター」を作成するには、同じコンポーネントに「アダプター ファクトリ」が必要です。

  • ファクトリは別のバンドルによって所有されています。

ServiceTracker (アクティベーター + サービス トラッカー) を使用して問題の一部を解決できます。アクティベーターは ServiceTraker をインスタンス化し、「デバイス」サービスのすべての変更を登録できます。

しかし、他のバンドルで作成されたDSファクトリをこのサービストラッカーに注入することはできません. 「デバイス」サービスの変更をリッスンします)。

では...どうすればこのシナリオを解決できますか? クラス メンバーとして DS を使用して Service Tracker (私に最適) を使用するにはどうすればよいですか?

4

1 に答える 1

1

Activator を使用せず、代わりにコンポーネントまたはサービス (A と呼びます) を宣言型サービスの 'activate(ComponentContext)' メソッドで使用します。activate メソッド内で、通常のように ServiceTracker をインスタンス化できます。

A の activate メソッド内で ServiceTracker をインスタンス化するときに、AdapterFactory を ServiceTracker に渡すこともできます。AdapterFactory は、ComponentContext から取得した BundleContext から取得するか、または (さらに良い) DS を使用して A コンポーネントへのサービス参照にすることで取得できます。

つまり、なぜ ServiceTracker が必要なのですか? 誤解しない限り、DS bind および unbind を使用して、サービスの可用性に関するイベントを受け取ることができます。

編集: 複数のカーディナリティを使用したバインド/バインド解除動作の (古い) 例: http://blog.tfd.co.uk/2009/11/12/declarative-optional-multiple-references-flaky-in-osgi/

編集:2つのアプローチの比較ですが、バインド/アンバインドにはあまり入りません:http://njbartlett.name/2010/08/05/when-servicetrackers-trump-ds.html

EDIT2:そうは言っても、私の一般的なポリシーは、非常にまれなケースを除いてアクティベーターを使用しないことです. DS、ipojo などを使用し、これらの技術者で定義したコンポーネントを使用して、BundleContext にアクセスし、ServiceTrackers などのより低レベルのオブジェクトを構築します。

于 2013-09-12T15:26:03.017 に答える