私は 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 から保存するからです。