2015-12-21 78 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」。 –