【问题标题】:How do Service / SourceProviders work in Eclipse 4 RCP 2.0?Service / SourceProviders 如何在 Eclipse 4 RCP 2.0 中工作?
【发布时间】:2023-03-31 16:40:01
【问题描述】:

我一直忙于未来并将旧的 eclipse 3.7 应用程序迁移到 Eclipse 4,虽然我对移植所有视图的应用程序模型感到满意,但我有许多我不确定的源提供程序移植明智。我一直在使用一些关于 Eclipse 4 的教程,包括 this Tutorial from good old Lars,但似乎没有一个涵盖这个特定元素。

对于少量的上下文,我现有的应用程序有一些扩展 AbstractSourceProvider 的类,这些类在 org.eclipse.ui.services 扩展点中注册。我的视图使用工作台中的ISourceProviderService.getSourceProvider(key) 函数将自己注册为这些服务的侦听器,并在该源触发源更改事件时更新自己。我也有一些提供者有时也会相互引用,所以我想知道这是否仍然适用于注入。

Eclipse 4 中使用了什么样的模型?我应该只使用相同的旧扩展点吗?这些扩展点服务能否以新的酷注释方式注入到视图中?

什么给了?

【问题讨论】:

  • 你说的是哪些扩展点?
  • 服务 sourceProvider 功能。 org.eclipse.ui.services
  • org.eclipse.ui.services 在纯 e4 应用程序中不可用。事实上,使用源提供程序的代码都不是 e4 的一部分。
  • 是的,我已经做到了这一点,问题是我到底该怎么做?我可以把它全部放在单例中并制作我自己的监听器接口,但这样做有什么意义,感觉就像倒退。
  • 可以通过多种方式将服务放入 Eclipse 上下文中,然后注入。事件可以在 Event Broker 上广播,并使用 @EventTopic 注入处理。

标签: eclipse-rcp e4


【解决方案1】:

您可以通过多种方式创建服务:

创建服务类的实例并将其放入IEclipseContext。这通常在“插件”中完成:

public class MyAddon
{
  @PostConstruct
  void postConstruct(IEclipseContext context)
  {
    MyService myService = ContextInjectionFactory.make(MyService.class, context);

    context.put(MyService.class, myService);
  }
}

“插件”在 application.e4xmi 文件中声明。

您也可以在 RCP 的 LifeCycle 类中创建这样的服务。

OSGi service 将自动添加到 Eclipse 上下文中。

您可以使用Context Function,它使用 OSGi 服务,但在需要之前不会创建实际服务。

在所有情况下,您都通过注入来引用服务:

@Inject
MyService myService;

请注意,注入仅对 Eclipse 从 application.e4xmi 中描述的对象创建的对象进行。可以使用ContextInjectionFactory 对其他对象进行注入。

【讨论】:

  • 谢谢你,真的很有用,如果我使用插件来做这些服务可以注入吗?我在这些服务中使用的 Eclipse 3 的另一个特性是在某些源值更改时禁用菜单项,如何使用源提供者的概念复制这种行为?
  • 我已更改 AddOn 示例以使用 ContextInjectionFactory 创建服务,以便它可以使用注入。菜单项可见性和启用是通过“核心表达式”(org.eclipse.core.expressions.definitions)和处理程序@CanExecute 方法完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多