我开始越来越热爱OSGi服务,并希望将更多我的组件作为服务实现。现在我正在寻找最佳做法,尤其是对于UI组件。OSGi服务 - 最佳实践
对于听者关系,我使用白板模式,恕我直言,意见是最好的方法。但是,如果我不仅需要通知,还可以考虑三种可能的解决方案。
试想以下情形:
interface IDatabaseService {
EntityManager getEntityManager();
}
[1]白板模式 - 自设置服务
我将创建一个新的服务接口:
interface IDatabaseServiceConsumer {
setDatabaseService(IDatabaseService service);
}
,并创建一个声明式IDatabaseService组件与bindConsumer这样的方法
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
现在,我只是添加绑定/取消绑定方法fo我的IDatabaseService并添加一个component.xml并添加我的DatabaseEntryViewer。这种方法假设有一个非参数构造函数,并且我通过OSGi-Service-Factory创建UI组件。
[3]经典的方式:ServiceTracker的
经典的方式登记在我的激活和访问静态ServiceTracker的。使用跟踪器的类必须处理动态。
目前我赞成第一个,因为这种方法不会使对象创建变得复杂,并将Activator从无尽的静态ServiceTracker中保存下来。
不明白,为什么你不是“注入”(绑定)IDatabaseService到IDatabaseServiceConsumer? –
嗨伊凡,目前我们没有使用任何DI框架,如Spring DI或Google juice。这对Eclipse RCP开发来说很难吗? – Muki
你还没有说出你实际想要达成的目标。所有这三种方法都可能是有效的,但不可能说什么是最好的,因为没有上下文。 –