Eclipse RCP 注入 IWizard 实例
Eclipse RCP Inject into instance of IWizard
我正在尝试注入我的向导的一些字段。
我可以使用以下助手成功注入我自己的 OSGi DS class:
public class UtilRCP {
public static void inject(Plugin plugin, Object object) {
IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(plugin.getBundle().getBundleContext());
ContextInjectionFactory.inject(object, serviceContext);
}
}
来自 RCP 生态系统的其他服务,如 PartService 或 MApplication 无法注入(空值/未找到参数 "MApplication" 的实际值)。
这是代码
public class MyWizard extends MyAbstractWizard implements IImportWizard {
private MyWizardPage page;
@Inject
private EPartService partService;
@Inject
private DatabaseProvider databaseProvider;
@Inject
private MApplication application;
public MyWizard() {
System.err.println("Create");
System.err.println(databaseProvider);
System.err.println(partService);
System.err.println(application);
}
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
UtilRCP.inject(Activator.getDefault(), this);
System.err.println("Init");
System.err.println(databaseProvider);
System.err.println(partService);
System.err.println(application);
}
@Override
public void addPages() {
super.addPages();
page = new MyWizardPage();
addPage(page);
}
@Override
public boolean performFinish() {
return true;
}
}
服务上下文内容非常有限,不适合这样使用。
在这样的 3.x 样式向导中,您可以使用以下方法从 IWorkbench
对象获取 workbench 上下文:
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
IEclipseContext context = (IEclipseContext)workbench.getService(IEclipseContext.class);
请注意,当对话框处于活动状态时,没有活动 'part'(因为对话框不是部件)。这可能会导致各种 API 出现问题。特别是应用程序 (workbench) 部分服务将给出异常,抱怨没有活动部分。
您可以通过使用以下方式显式获取顶级 window 的部件服务来获取工作部件服务:
@Inject
MApplication application;
@Inject
EModelService modelService;
MWindow window = (MWindow)modelService.find("top level window id", application);
EPartService partService = window.getContext().get(EPartService.class);
我认为 3.x RCP 的顶级 window ID 是 "IDEWindow"。
如果它是 E4 应用程序,您可以在 Application.e4xml.[=] 中找到 main window id 13=]
我正在尝试注入我的向导的一些字段。
我可以使用以下助手成功注入我自己的 OSGi DS class:
public class UtilRCP {
public static void inject(Plugin plugin, Object object) {
IEclipseContext serviceContext = EclipseContextFactory.getServiceContext(plugin.getBundle().getBundleContext());
ContextInjectionFactory.inject(object, serviceContext);
}
}
来自 RCP 生态系统的其他服务,如 PartService 或 MApplication 无法注入(空值/未找到参数 "MApplication" 的实际值)。
这是代码
public class MyWizard extends MyAbstractWizard implements IImportWizard {
private MyWizardPage page;
@Inject
private EPartService partService;
@Inject
private DatabaseProvider databaseProvider;
@Inject
private MApplication application;
public MyWizard() {
System.err.println("Create");
System.err.println(databaseProvider);
System.err.println(partService);
System.err.println(application);
}
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
UtilRCP.inject(Activator.getDefault(), this);
System.err.println("Init");
System.err.println(databaseProvider);
System.err.println(partService);
System.err.println(application);
}
@Override
public void addPages() {
super.addPages();
page = new MyWizardPage();
addPage(page);
}
@Override
public boolean performFinish() {
return true;
}
}
服务上下文内容非常有限,不适合这样使用。
在这样的 3.x 样式向导中,您可以使用以下方法从 IWorkbench
对象获取 workbench 上下文:
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
IEclipseContext context = (IEclipseContext)workbench.getService(IEclipseContext.class);
请注意,当对话框处于活动状态时,没有活动 'part'(因为对话框不是部件)。这可能会导致各种 API 出现问题。特别是应用程序 (workbench) 部分服务将给出异常,抱怨没有活动部分。
您可以通过使用以下方式显式获取顶级 window 的部件服务来获取工作部件服务:
@Inject
MApplication application;
@Inject
EModelService modelService;
MWindow window = (MWindow)modelService.find("top level window id", application);
EPartService partService = window.getContext().get(EPartService.class);
我认为 3.x RCP 的顶级 window ID 是 "IDEWindow"。
如果它是 E4 应用程序,您可以在 Application.e4xml.[=] 中找到 main window id 13=]