【问题标题】:Dependency Injection/IOC when extending the Eclipse IDE扩展 Eclipse IDE 时的依赖注入/IOC
【发布时间】:2009-09-11 23:38:18
【问题描述】:

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

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

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

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

使用标准的 OSGI 东西,我只会使用来自 ServiceTracker 的服务。

不幸的是,我在 Eclipse OSGI 领域,在那里我无法创建我的向导类,传递我的 ServiceTracker,而是 Eclipse 制作了我的插件。

如果在我的 Activator 中不使用单例,Eclipse 是否提供了一些用于 IoC/依赖注入的机制,或者至少提供了一种从这些 UI 类中查询服务的方法?

谢谢

【问题讨论】:

    标签: eclipse dependency-injection osgi


    【解决方案1】:

    这是您可以采用的一种方法,我认为这是一种非常适合 Eclipse 的方法。

    • 定义你的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 之前,具有自定义服务实现的插件可以保持卸载状态。

    【讨论】:

    • 它仍然使用单例(平台),但它确实是 Eclipse 3.x 的方式。这将随着 e4 上的依赖注入而改变(实际上是扩展的)。
    【解决方案2】:

    扩展点似乎是正确的。

    如果您仍想使用 OSGi,要创建 ServiceTracker,您首先需要一个捆绑上下文。当然,如果你有一个单例的 Activator,它很容易获得 (.getDefault().getBundle())。

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

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 2016-06-22
      • 2011-12-12
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2018-12-18
      • 2019-06-25
      相关资源
      最近更新 更多