2011-07-27 13 views
8

私はこのシナリオを持っていますが、私は同じインタフェースを提供する3つの宣言型サービスを持っています(リーダーインターフェイスと私はreadimpl1データベースreadimpl2フラットファイルreadimpl3メモリを持っています)。私は、データベース実装にのみバインドするコンシューマを持っていたいと思います。コンポーネント定義では名前を付けるので、その名前がレジストリにあることを確信しています。アクティブメソッドを追加すると、名前を使用してコンポーネントコンテキストから参照できます。Osgi宣言的サービス条件付きバインディング

パラメータとしてサービス名を使用してもバインド/バインド解除で試してみたいと思います。私はかなりコンポーネントの参照要素の "ターゲット"パラメータがこれを行うために使用することができますが、私はそれを使用する方法を見つけていないと確信しています。

他にもこれを行っていますか?

これは

+0

本当に興味深い質問です。それはあなたが*データベースのimplを好むが、別のものを受け入れるかどうかの関連する問題を考えさせる。このシナリオでは、@Reference(cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE、policy = ReferencePolicy.DYNAMIC)を使用して実装し、追加/削除メソッドのリストを調べることができます。 –

答えて

14

ターゲットは、単にのOSGi filterある @Reference(マッピングされ名= "FOO")を使用するのと同様であろう。これを使用して、任意のサービスプロパティでフィルタリングすることができます。あなたのサービスは値fileまたはdatabasebackendというプロパティを持っているのであれば、次のターゲットと結合することができます。

<scr:reference ... target="(backend=database)"/> 

としてバックエンドのデータベース自体にサービスが登録されます:これは

<scr:component ...> 
    ... 
    <property name="backend" type="String" value="database"/> 
</scr:component> 
関連する問題