【问题标题】:Get e4 service without injection无需注入即可获得e4服务
【发布时间】:2014-07-22 10:49:03
【问题描述】:

我正在尝试调整 Eclipse RCP 3.x 应用程序以使用来自 e4 的一些工具。因此,没有 e4xmi 文件。

特别是,我需要访问一些服务:

public class RunModeService {

@Inject
private static ECommandService commandService;
@Inject 
private static EHandlerService handlerService;

...
}

看来,如果我自己实例化该类(就像我正在做的那样),则不会发生任何注入。

是否可以通过其他方式获取这些服务?如果是这样,我可以开始挂钩 e4 和 DI,方法是创建一个命令,该命令的处理程序由框架实例化并在其中发生注入。

【问题讨论】:

    标签: java eclipse rcp e4


    【解决方案1】:

    如果您有IEclipseContext,您可以使用以下方法获取对象:

    ECommandService commandService = eclipseContext.get(ECommandService.class);
    

    IEclipseContext可以注入。

    您可以使用 ContextInjectionFactory 创建自己的对象,这将为您的对象执行 DI:

    MyClasss myClass = ContextInjectionFactory.make(MyClass.class, eclipseContext);
    

    或者您可以使用以下方法对现有类实例进行注入:

    ContextInjectionFactory.inject(myClass, eclipseContext);
    

    在视图或编辑器中,您可以使用以下方法从视图/编辑器站点获取 Eclipse 上下文:

    eclipseContext = ((PartSite)getSite()).getContext();
    

    但是 PartSite 是一个内部类,所以真的不应该使用它。

    【讨论】:

    • 看来IEclipseContext也需要注入。从这个问题中,我得到了 BundleContext 并用它来获取 IEclipseContext:stackoverflow.com/questions/18316970/…。但是,我的新上下文不包括 ECommandService,或者实际上是 MApplication。我想知道如果你创建了一个e3应用程序是不是没有创建应用程序模型。
    • 该上下文是专门的 OSGi 服务上下文,仅包含 OSGi 服务。您需要来自 MApplication 或 MPart 的上下文。所有 Eclipse 4 应用程序在底层都是 e4,3.x 应用程序只是在 e4 之上有很多兼容性代码。
    【解决方案2】:

    您也可以使用活动的IEclipseContext 手动注入您的课程:

    IEclipseContext context = getActiveEclipseContext();
    RunModeService service = ContextInjectionFactory.make(RunModeService.class, context);
    

    要在没有 DI 的情况下获取活动的IEclipseContext,您可以使用来自this answer 的示例代码。

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 2021-01-31
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2015-03-07
      • 2016-11-19
      相关资源
      最近更新 更多