DI和继承
在我从E3应用程序迁移到纯E4期间出现了另一个问题。DI和继承
在那里我有一个从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仍为空
如果您使用ContextInjectionFactory
创建您的对象,它们将被注入。用途:
MyClass myClass = ContextInjectionFactory.make(MyClass.class, context);
其中context
是IEclipseContext
(所以你必须为每一个类从1开始由Eclipse的注入做到这一点)。
还有一个ContextInjectionFactory.make
秒的版本,它允许您提供两个上下文,第二个是可以包含附加值的临时上下文。
感谢您的回应!我在我的AbstractRootEditor中定义了AbstractSubView的上下文,但是我仍然不确定要设置哪个上下文,因为我无法在AbstractSubView中选择上下文 –
对不起,我不理解评论。向我们展示一些实际代码。 –
我现在编辑我的帖子,我首先对我应该输入的上下文感到好奇,但MApplication.getContext没有工作,并且抛出了InjectionException:无法处理“MenuService.myPart”:没有找到实际的值参数“MPart”。 –
你在哪里测试'eMenuService'为空?它将在'TableSubView'构造函数中为null,因为字段注入直到构建完成才会完成。 –
我忘了PostConstruct-Method中的所有内容。 好像我必须携带MenuService通过类... –