我可以更改用于注入我的处理程序的上下文吗?

Can I change what context is used to inject my handler?

我们的 e3/e4 RCP 应用程序由一堆带有模型片段的组件组成。在升级到 e4 之前,我们在每个组件中都有 Guice 模块,用于将成员注入 class.

目前我们已经设置了一个 superclass 来检测自定义 DoExecute 和 DoCanExecute 注释,这些注释使用 ContextInjectionFactory 通过自定义上下文调用这些方法。

示例:

        IEclipseContext subContext = (IEclipseContext) context.get(contextName);
    return (T) ContextInjectionFactory.invoke(this, annotation, subContext);

这成功地在执行我们为其创建注释的方法时使用特定的上下文来注入成员,但是有点丑陋并且必须对在 e4 中注入的所有注释完成。

在 e4 中定义和使用自定义上下文的最佳方式是什么?注意:我们不想使用 IApplicationContext,因为它会违反每个组件的模块化设置。

IEclipseContext 由 Eclipse4 框架以分层方式管理。通常,您将 ApplicationContext 作为父上下文,然后是子上下文的层次结构,例如 Workbench > Window > Perspective > Part。

根据我在 E4 开发方面的经验,在多模块应用程序的情况下,我会使用不同的键将我的模型对象存储在 ApplicationContext 中。

让我解释一下:IEclipseContext 是一个哈希表,您可以在其中使用不同的键存储多个对象。因此,系统中的每个模块(片段或包)都可以使用不同的键将其模型数据保存到 IApplicationContext 中。

例如,如果您有三个模块,在您的系统中,一个是平台,两个只是 "module1" 和 "module2",您可以将每个模块的数据存储在应用上下文,如下:

**KEY**                 **VALUE**
org.myapp.platform  Java Object representing data model of the platform
org.myapp.module1   Java Object representing data model of the module1
org.myapp.module2   Java Object representing data model of the module2

顺便说一句,如果您担心在上下文中公开的数据,您可以删除一个上下文对象,方法是在特定键对应的位置设置一个空值。

希望对您有所帮助。

您可以查看以下参考资料进行更深入的研究: