代码之家  ›  专栏  ›  技术社区  ›  Eric Anderson

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

  •  3
  • Eric Anderson  · 技术社区  · 15 年前

    假设我正在构建一个非常简单的Eclipse插件,用于创建新的Java项目。

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

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

    • 我的“主插件”(使用mynewwizard)
    • 我的“接口插件”(使用imyservice)
    • 我的实现插件(使用myServiceImpl)

    使用标准的OSGi工具,我只需要使用ServiceTracker提供的服务。

    不幸的是,我在Eclipse OSGi-Land中,在那里我不能创建我的向导类,而是传入我的ServiceTracker,而是Eclipse生成了我的插件。

    在我的激活器中不使用singleton,Eclipse是否提供了一些IOC/依赖注入机制,或者至少提供了一种从这些UI类查询服务的方法?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  3
  •   Dave Ray    15 年前

    这里有一个方法,你可以采取,我认为这是一个相当Eclipse-Y的方法。

    • 定义你的 IMyService 界面
    • 在你的插件中,定义一个新的扩展点,比如“myplugin.myservice”
    • 在该扩展点的架构中(PDE将为您创建一个),将一个名为“MyService”的元素加上一个名为“类”的属性(或任何东西),并将其类型设置为“Java”。将所需接口(实现字段)设置为 IMY服务 .

    现在,在向导中,添加一些代码来定位和实例化 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 ,具有自定义服务实现的插件可以保持卸载状态。

        2
  •  1
  •   zvikico    15 年前

    扩展点似乎是正确的。

    如果您仍然想使用OSGi,要创建ServiceTracker,首先需要一个bundle上下文。当然,如果你有一个单体激活剂,它是简单而简单的( .getDefault().getBundle() )

    但是,如果知道包的“符号名”使用 Platform.getBundle() . 这同样有效。