如何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/)。
我的应用程序由许多部分组成,它们在应用程序的 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/)。