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=]