DI和继承

时间:2015-12-21 14:53:31

标签: eclipse inheritance dependency-injection eclipse-rcp e4

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

我使用继承获得了一个结构,如下图所示。 enter image description here

我有一个从AbstractRootEditor到FormRootEditor到SashCompositeSubView到TableSubView的调用序列。 在那里我想使用我的EMenuService,但由于它不能被注入它是null。

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

我想在AbstractSubView中注入EMenuService,否则我需要通过我的所有类来运行服务。但我没有IEclipseContext,因为我的AbstractSubView没有与应用程序模型连接(我吗?)。

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

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

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

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

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

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

以及我的Field-Injection:

@Inject EMenuService eMenuService

这有点不起作用,eMenuService仍为空

1 个答案:

答案 0 :(得分:1)

如果使用ContextInjectionFactory创建对象,则会注入它们。使用:

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

其中contextIEclipseContext(所以你必须从Eclipse注入的每个类开始执行此操作)。

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