OSGi服务 - 最佳实践

3

我越来越喜欢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。


不明白,为什么你没有将IDatabaseService“注入”(绑定)到IDatabaseServiceConsumer中呢? - Ivan Dubrov
嗨,伊万,目前我们没有使用任何像Spring DI或Google juice这样的DI框架。对于Eclipse RCP开发来说,这是否是一条漫长的道路呢? - Muki
你还没有说出你实际想要达到什么目的。这三种方法都可能是有效的,但由于缺乏上下文,很难说哪种最好。 - Neil Bartlett
话虽如此,第一种方法似乎没有意义。实际上它是相反的,为什么要将消费者注入到提供者中?关于你对伊万的问题...你为什么认为需要Spring或Guice才能进行注入??声明式服务为您提供注入(又称“绑定”)。 - Neil Bartlett
我的主要目标是在由Eclipse RCP框架实例化的UI组件中使用我的服务。这就是为什么我不能使用声明式服务的原因。第一种方法是一个不太优雅的解决方法,可以“注入”服务。我阅读了一些关于Spring依赖注入的内容,并发现DI机制与第二种方法类似,我个人认为。 - Muki
1个回答

2
我必须同意@Neil Bartlett的看法,你的选项1是反向的。实际上,你正在使用观察者/可观察者模式。
选项2不会起作用,因为RCP中管理UI对象生命周期的方式不允许你做你想做的事情。小部件必须作为某种视图容器(ViewPart、Dialog等)初始化的一部分创建。这个视图部分通常是通过工作台/插件机制进行配置和管理的。你应该与之合作,而不是对抗它。
选项3将是一个简单的选择,不一定是最好的,但是简单。
如果你使用Spring DM,那么你可以轻松地完成选项2。它提供了一种将服务bean注入到UI视图、页面等中的方法。你使用一个Spring工厂来创建你的视图(如在你的plugin.xml中定义的),它通过Spring配置进行配置,能够将你的服务注入到bean中。
您也可以尝试结合 SpringExtensionFactory 类使用 DI 技术来完成相同的事情,而不引入另一种技术。我自己没有尝试过,所以无法评论难度,但如果我没有使用 Spring DM,我会尝试这样做来弥合 RCP 和 OSGi 之间的差距。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接