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] 让我的课程成为一项服务

图像类如

公共类 DatabaseEntryViewer 扩展 TableViewer

现在,我只需为我的 IDatabaseService 添加绑定/取消绑定方法并添加一个 component.xml 并添加我的 DatabaseEntryViewer。这种方法假设有一个非参数构造函数,并且我通过 OSGi-Service-Factory 创建 UI 组件。

[3] 经典方式:ServiceTracker

在我的 Activator 中注册静态 ServiceTracker 并访问它的经典方法。使用跟踪器的类必须处理动态。

目前我更喜欢第一种,因为这种方法不会使对象创建复杂化,并将 Activator 从无休止的静态 ServiceTracker 中保存下来。

4

1 回答 1

2

我必须同意@Neil Bartlett,您的选项 1 是倒退的。您实际上使用的是 Observer/Observable 模式。

第 2 点是行不通的,因为在 RCP 中管理 UI 对象生命周期的方式不允许你做你想做的事。该小部件必须作为某种视图容器(ViewPart、Dialog、...)的初始化的一部分来创建。该视图部分通常通过工作台/插件机制进行配置和管理。你应该解决这个问题,而不是反对它。

3 号将是一个简单的选择,不一定是最好的,但很简单。

如果您使用Spring DM,那么您可以轻松完成第 2 点。它提供了一种将服​​务 bean 注入您的 UI 视图、页面等的方法。您使用 spring 工厂来创建视图(如 plugin.xml 中定义的那样) ,它是通过 Spring 配置配置的,它能够将您的服务注入到 bean 中。

您还可以将 SpringExtensionFactory 类使用的技术与 DI 结合起来完成同样的事情,而无需引入另一项技术。我自己没有尝试过,所以我无法评论其中的困难,尽管如果我还没有使用 Spring DM,我会尝试这样做来弥合 RCP 和 OSGi 之间的差距。

于 2011-10-31T17:35:15.893 回答