假设我正在构建一个非常简单的eclipse插件来创建新的java项目。
我显然会为扩展点org.eclipse.ui.newWizards创建一个新的向导。但是,我真正想要的是允许其他插件实现驱动这个新向导的服务。
所以理论上我们有三个插件:
使用标准的OSGI内容,我只会使用ServiceTracker中的服务。
不幸的是,我在Eclipse OSGI的土地上,我没有创建我的向导类,传入我的ServiceTracker,而是Eclipse制作了我的插件。
没有在我的Activator中使用单例,Eclipse是否提供了一些IoC / Dependency Injection机制,或者至少是一种从这些UI类查询服务的方法?
由于
答案 0 :(得分:3)
这是你可以采取的一种方法,我认为这是一种很好的Eclipse-y方式。
IMyService
界面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()
知道其符号名称,则可以找到您的捆绑包。这也有效。