如何get/inject EPartService outside part or in LifeCycle Manager or 如何真正意义上控制e4 RCP app的生命周期?

How to get/inject EPartService outside part or in LifeCycle Manager or How to control life cycle of e4 RCP app in true sense?

我的应用程序由许多部分组成,它们在应用程序的 e4xmi 文件中定义。我想动态地隐藏和显示它们。我正在使用 EpartService 在处理程序中执行此操作,我可以在其中注入它。

但我也想用生命周期管理器之类的东西来控制部件的 show/hide,我不能在其中注入 EPartService。有什么方法可以实现并完全控制RCP应用程序的生命周期?

这里似乎有完全相同的问题,但没有解决方案: https://www.eclipse.org/forums/index.php/t/595958/

我想实施 'remember me like feature',其中显示登录屏幕的部分而不是其他部分。同样在注销后将显示相同的登录部分。所以我需要控制 RCP 应用程序的生命周期。但我无法在应用程序的 e4xmi 中的任何内容启动之前注入 EPartService。

如果您从注入的东西(例如 LifeCycle class)创建 class,您可以使用 ContextInjectionFactory 通过注入创建 class:

@Inject
IEclipseContext context;


MyClass myClass = ContextInjectionFactory.make(MyClass.class, context);

或者,如果您只是将 IEclipseContext 传递给 class,您可以使用以下方式获得部件服务:

EPartService partService = context.get(EPartService.class);

注意:每个部件都有一个单独的部件服务实例。根据您正在做的事情,您可能需要确保您拥有活动部分的服务。

如果您不局限于使用 SWT,则可以改用 JavaFX 的 e(fx)clipse e4 渲染器。

e(fx)clipse 有更多的可能性来控制应用程序的生命周期。例如,您可以 return a Boolean from @PostContextCreate 来表示是否要继续启动。不过,您将无法在此处使用 EPartService,但您可以使用依赖注入来滚动自己的登录对话框,正如 greg-449 在他的回答中所描述的那样。

public class StartupHook {

    @PostContextCreate
    public Boolean startUp(IEclipseContext context) {
        // show your login dialog
        LoginManager loginManager = ContextInjectionFactory.make(LoginManager.class, context);
        if(!loginManager.askUserToLogin()) {
            return Boolean.FALSE;
        }
        return Boolean.TRUE;
    }

}

(您也可以重启应用程序。表格 更多详细信息,请参阅 http://tomsondev.bestsolution.at/2014/11/03/efxclipse-1-1-new-features-api-to-restart-your-e4-app-on-startup/)。