我正在尝试注入一些向导的字段。
我可以使用以下帮助程序类成功注入自己的OSGi DS:
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)无法注入(null /没有找到参数的实际值" 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;
}
}
答案 0 :(得分:1)
服务上下文的内容非常有限,不适合这样使用。
在这样的3.x样式向导中,您可以使用以下命令从IWorkbench
对象获取工作台上下文:
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
IEclipseContext context = (IEclipseContext)workbench.getService(IEclipseContext.class);
请注意,当对话框处于活动状态时,没有活动的“部分”(因为对话框不是其中的一部分)。这可能会导致各种API出现问题。特别是应用程序(工作台)部件服务将提供一个例外,抱怨没有活动部件。
您可以使用以下方式显式获取顶级窗口的零件服务来获得工作零件服务:
@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的顶级窗口ID是“IDEWindow”。
如果是E4应用程序,您可以在 Application.e4xml 中找到主窗口ID 。