我越来越喜欢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] 将我的类变成服务
假设有一个类:
public class DatabaseEntryViewer extends TableViewer
现在,我只需为我的IDatabaseService添加绑定/解绑方法,并添加一个component.xml并添加我的DatabaseEntryViewer即可。这种方法假定存在一个无参数构造函数,并且我通过OSGi-Service-Factory创建UI组件。
[3] 传统方式:ServiceTracker
传统的方式是在我的Activator中注册一个静态的ServiceTracker并访问它。使用跟踪器的类必须处理动态问题。
目前,我更喜欢第一种方法,因为这种方法不会复杂化对象创建,并且可以避免Activator中无休止的静态ServiceTracker。