2015-12-21 30 views
0

在我从E3应用程序迁移到纯E4期间出现了另一个问题。DI和继承

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

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

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()); 

首先我有一个例外,说我TableSubView.class了一个无效的构造函数,所以现在的构造方法有:

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

,以及我的现场注入:

@Inject EMenuService eMenuService 

这是一种不工作,eMenuService仍为空

+0

你在哪里测试'eMenuService'为空?它将在'TableSubView'构造函数中为null,因为字段注入直到构建完成才会完成。 –

+0

我忘了PostConstruct-Method中的所有内容。 好像我必须携带MenuService通过类... –

回答

1

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

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

其中contextIEclipseContext(所以你必须为每一个类从1开始由Eclipse的注入做到这一点)。

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

+0

感谢您的回应!我在我的AbstractRootEditor中定义了AbstractSubView的上下文,但是我仍然不确定要设置哪个上下文,因为我无法在AbstractSubView中选择上下文 –

+0

对不起,我不理解评论。向我们展示一些实际代码。 –

+0

我现在编辑我的帖子,我首先对我应该输入的上下文感到好奇,但MApplication.getContext没有工作,并且抛出了InjectionException:无法处理“MenuService.myPart”:没有找到实际的值参数“MPart”。 –