のは、私がどこかからファイルを取得するための本当にシンプルなインターフェイスを持っているとしましょう:のOSGiサービスのプロキシを作成する方法を
interface FileManager {
File getFile(Object data);
}
我々がこのインタフェースの複数の実装があり、すべてのアプリケーションが唯一のインターフェイスを使用していると仮定することができます
OSGiのコンテキストにどのような実装が提供されているかは、幸せには分かりません。
ファイルを取得するいくつかの方法が実際には遅いため、オプションのキャッシュを追加します。しかし、私はアプリケーションがFileManager
インタフェースから別のインタフェースに変更されることを望んでいません。それは、アプリケーションがどの実装を使用しているか(そして遅いかどうか)を認識させるからです。
だから私はこの思い付いた:
class FileManagerCache implements FileManager {
private final Map<Object, File> cache = new HashMap<>();
public File getFile(final Object data) {
if (this.cache.containsKey(data)) {
return this.cache.get(data);
}
final File result = getDelegate().getFile(data);
this.cache.put(data, result);
return result;
}
private FileManager getDelegate() {
for (final FileManager fileManager : ServiceUtil.findServices(FileManager.class)) {
if (this != fileManager) {
return fileManager;
}
}
throw new UnsupportedOperationException("No FileManager is present!"); //$NON-NLS-1$
}
}
この実装は可能なのリストに並んでいる次のいずれかに非常に高い"service.ranking"
に登録し、そのアプリケーションが使用する最初のもの、それは委譲しています実装。
このアプローチは非常にエレガントではなく、おそらくエラーが発生する可能性があります。標準的なメカニズムを使ってOSGiでプロキシを作成するには?
これはまだ彼が取得するどの実装を知る方法はありません、呼び出し元に使用するサービスを決定する責任をプッシュします。これは複数の実装が遅い場合でも実際には機能しません。 –
少なくとも、宣言型サービスの場合、構成内のサービス参照のフィルタをカスタマイズできます。だから、それはユーザーによって決めることができます。または、完全に自動化されたシステムを使いたいですか? –
私の質問は、未知の他の実装に委任しながら、サービスインタフェースの実装として機能するプロキシを作成する方法についての詳細です。 –