我开始越来越喜欢 OSGi 服务,并希望将我的更多组件实现为服务。现在我正在寻找最佳实践,尤其是对于 UI 组件。
对于听众关系,我使用白板模式,恕我直言,这是最好的方法。但是,如果我想要的不仅仅是通知,我可以想到三种可能的解决方案。
想象以下场景:
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。
[更新]用法如下所示:
class MyUIClass ... {
private IDatabaseService dbService;
Consumer c = new IDatabaseServiceConsumer() {
setDatabaseService(IDatabaseService service) {
dbService = service;
}
}
Activator.registerService(IDatabaseServiceConsumer.class,c,null);
...
}
[2] 让我的课程成为一项服务
图像类如
公共类 DatabaseEntryViewer 扩展 TableViewer
现在,我只需为我的 IDatabaseService 添加绑定/取消绑定方法并添加一个 component.xml 并添加我的 DatabaseEntryViewer。这种方法假设有一个非参数构造函数,并且我通过 OSGi-Service-Factory 创建 UI 组件。
[3] 经典方式:ServiceTracker
在我的 Activator 中注册静态 ServiceTracker 并访问它的经典方法。使用跟踪器的类必须处理动态。
目前我更喜欢第一种,因为这种方法不会使对象创建复杂化,并将 Activator 从无休止的静态 ServiceTracker 中保存下来。