扩展Eclipse IDE时的依赖注入/ IOC

时间:2009-09-11 23:38:19

标签: eclipse dependency-injection osgi

假设我正在构建一个非常简单的eclipse插件来创建新的java项目。

我显然会为扩展点org.eclipse.ui.newWizards创建一个新的向导。但是,我真正想要的是允许其他插件实现驱动这个新向导的服务。

所以理论上我们有三个插件:

  • 我的“主要插件”(使用MyNewWizard)
  • 我的“界面插件”(使用IMyService)
  • 我的实现插件(使用MyServiceImpl)

使用标准的OSGI内容,我只会使用ServiceTracker中的服务。

不幸的是,我在Eclipse OSGI的土地上,我没有创建我的向导类,传入我的ServiceTracker,而是Eclipse制作了我的插件。

没有在我的Activator中使用单例,Eclipse是否提供了一些IoC / Dependency Injection机制,或者至少是一种从这些UI类查询服务的方法?

由于

2 个答案:

答案 0 :(得分:3)

这是你可以采取的一种方法,我认为这是一种很好的Eclipse-y方式。

  • 定义您的IMyService界面
  • 在插件中,定义一个新的扩展点,例如“myplugin.myservice”
  • 在该扩展点的模式中(PDE将为您创建一个),添加一个名为“myService”的元素,其中包含一个名为“class”(或其他)的属性,并将其类型设置为“java”。将所需的接口(Implements字段)设置为IMyService

现在,在向导中添加一些代码来查找和实例化IMyService的实现。像这样:

IExtensionRegistry registry = Platform.getExtensionRegistry();
for(IConfigurationElement element : registry.getConfigurationElementsFor("myplugin.myservice"))
{
    if("myService".equals(element.getName()))
    {
        return (IMyService) element.createExecutableExtension("class"));
    }
}
return new DefaultMyService();

这将为您提供第一个已注册的实现,如果没有,则为默认值。或者,您可以向扩展点架构添加更多元数据,并使用它生成供用户选择的选项列表或其他内容。

我认为,这是首选的Eclipse方法,因为它保留了延迟加载。也就是说,在您实际调用createExecutableExtension之前,具有自定义服务实现的插件可以保持卸载状态。

答案 1 :(得分:1)

扩展点似乎正确。

如果您仍想使用OSGi,要创建ServiceTracker,首先需要捆绑上下文。当然,如果你有一个单例激活器,它很简单(.getDefault().getBundle())。

但是,如果您使用Platform.getBundle()知道其符号名称,则可以找到您的捆绑包。这也有效。