DI和继承

DI and inheritance

在我从 E3 应用程序迁移到纯 E4 的过程中出现了另一个问题。

我得到了一个使用继承的结构,如下图所示。

我有一个从 AbstractRootEditor 到 FormRootEditor 到 SashCompositeSubView 到 TableSubView 的调用序列。 在那里我想使用我的 EMenuService,但由于无法注入,所以它是空的。

AbstractRootEditor 是唯一 class 连接到应用程序模型(作为从 MPartDescriptor 创建的 MPart)。

无论如何,我都想在 AbstractSubView 中注入 EMenuService,否则我将需要在我的所有 classes 中携带该服务。但是我那里没有 IEclipseContext,因为我的 AbstractSubView 没有与应用程序模型连接(我可以吗?)。

我有机会在 AvstractSubView 中注入服务吗?

编辑: 我注意到在我的 AbstractSubView 中注入这个是不可能的(?),所以我试图将它放入我的 TableSubView 中。

在 gregs 评论后我想展示一些代码: 在 AbstractRootEditor 中:

    @PostConstruct
    public final void createPartControl(Composite parent, @Active MPart mPart) {
...
ContextInjectionFactory.make(TableSubView.class, mPart.getContext());

首先我得到一个异常,说我的 TableSubView.class 有一个无效的构造函数,所以现在的构造函数是:

public TableSubView() {
        this.tableInputController=null;
    }

以及我的现场注入:

@Inject EMenuService eMenuService

这有点不起作用,eMenuService 仍然是 null

如果您使用 ContextInjectionFactory 创建对象,它们将被注入。使用:

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

其中 context 是一个 IEclipseContext(因此您必须对从 Eclipse 注入的每个 class 执行此操作)。

还有一个 ContextInjectionFactory.make 的秒版本,它允许您提供两个上下文,第二个是可以包含其他值的临时上下文。