2011-10-27 261 views
3

我开始越来越热爱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中保存下来。

+0

不明白,为什么你不是“注入”(绑定)IDatabaseService到IDatabaseServiceConsumer? –

+0

嗨伊凡,目前我们没有使用任何DI框架,如Spring DI或Google juice。这对Eclipse RCP开发来说很难吗? – Muki

+0

你还没有说出你实际想要达成的目标。所有这三种方法都可能是有效的,但不可能说什么是最好的,因为没有上下文。 –

回答

2

我必须同意@尼尔巴特利特,你的选择1是落后的。您实际上正在使用Observer/Observable模式。

由于UI对象生命周期在RCP中管理的方式不允许你做你想做的事,因此2号不会起作用。小部件必须作为某种视图容器(ViewPart,Dialog,...)初始化的一部分来创建。这个视图部分通常通过Workbench /插件机制进行配置和管理。你应该与此合作,而不是反对它。

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

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

您也可以将SpringExtensionFactory类与DI一起使用的技术与DI完成相同的工作,而不需要引入其他技术。我没有自己尝试过,所以我不能评论这个难点,尽管如果我没有使用Spring DM,我会尽力弥合RCP和OSGi之间的差距。