2009-09-11 67 views
3

假設我構建了一個用於創建新java項目的非常簡單的eclipse插件。擴展Eclipse IDE時的依賴注入/ IOC

我明顯會爲擴展點org.eclipse.ui.newWizards創建一個新嚮導。但是,我真正想要的是允許其他插件實現驅動這個新嚮導的服務。

所以在理論上,我們有三個插件:

  • 我的 「主插件」(與MyNewWizard)
  • 我 「界面插件」(與IMyService)
  • 我實現插件(與MyServiceImpl)

使用標準的OSGI的東西,我只會使用ServiceTracker的服務。

不幸的是,我在Eclipse OSGI的土地上,我沒有創建我的嚮導類,傳入我的ServiceTracker,而是Eclipse使我的插件。

沒有在我的Activator中使用單例,Eclipse是否爲IoC /依賴注入提供了一些機制,或者至少有一種方法來從這些UI類中查詢服務?

感謝

回答

3

這裏有一個方法,你可以採取我認爲這是一個漂亮的Eclipse-Y的方式來做到這一點。

  • 定義您IMyService接口
  • 在你的插件,定義一個新的擴展點,說「myplugin.myservice」
  • 在架構對於擴展點(PDE會爲您創建一個),添加稱爲「myService」的元素具有稱爲「class」(或其他)的屬性,並將其類型設置爲「java」。將所需的接口(Implements字段)設置爲IMyService

現在,在嚮導中,添加一些代碼來定位和實例化IMyService的實現。類似這樣的:

IExtensionRegistry registry = Platform.getExtensionRegistry(); 
for(IConfigurationElement element : registry.getConfigurationElementsFor("myplugin.myservice")) 
{ 
    if("myService".equals(element.getName())) 
    { 
     return (IMyService) element.createExecutableExtension("class")); 
    } 
} 
return new DefaultMyService(); 

這將給你第一個註冊的實現,或者如果沒有的話,默認的。或者,您可以向擴展點模式添加更多元數據,並使用它來生成供用戶選擇的選項列表或其他內容。

這是,我相信,首選的Eclipse方法來做到這一點,因爲它保留了延遲加載。也就是說,除非實際調用createExecutableExtension,否則帶定製服務實現的插件可以保持卸載狀態。

+0

它依然採用的是單(平臺),但它確實是去的Eclipse 3.x的方式這將隨着e4上的依賴注入而改變(實際上是擴展的)。 – 2010-12-22 18:33:48

1

擴展點似乎是正確的。

如果你還想用OSGi去創建一個ServiceTracker,你首先需要一個bundle上下文。當然,如果你有一個單身激活器,它很簡單明瞭(.getDefault().getBundle())。

但是,如果您使用Platform.getBundle()知道其符號名稱,則可以找到您的套件。這也適用。