2009-09-11 3 views
3

새 Java 프로젝트를 작성하기위한 매우 간단한 Eclipse 플러그인을 빌드한다고 가정합니다.Eclipse IDE를 확장 할 때 종속성 삽입/IOC

나는 분명히 확장 점 org.eclipse.ui.newWizards위한 새로운 마법사를 생성합니다. 그러나 내가 정말로 원하는 것은 다른 플러그인이이 새로운 마법사를 구동하는 서비스를 구현할 수 있도록 허용하는 것입니다.

그래서 이론적으로 우리는 세 가지 플러그인이 있습니다

  • 내 (MyNewWizard와) "주 플러그인"
  • (IMyService 포함) (MyServiceImpl와)
  • 내 구현 플러그인 내 "인터페이스 플러그인" 표준 OSGI 물건을 사용 는

, 난 그냥 ServiceTracker를에서 서비스를 사용할 수 있습니다.

불행하게도, 임 Eclipse에서 OSGI의 내 ServiceTracker를 전달, 내 마법사 클래스를 만들 수없는 땅, 그러나 오히려 이클립스 내 플러그인을한다. 내 활성제에 싱글을 사용하지 않고

는, Eclipse는 IOC의/의존성 삽입 (Dependency Injection) 또는 이러한 UI 클래스의 서비스를 쿼리 할 수있는 최소한 방식에서 몇 가지 메커니즘을 제공합니까?

감사

답변

3

여기에 내가 할 수있는 꽤 이클립스-Y 방법은 생각 당신이 취할 수있는 하나의 방법입니다.

  • 말, 새로운 확장 점을 정의 플러그인에서 "myplugin.myservice"그 확장 점의 스키마 (PDE는 당신을 위해 하나를 작성합니다)에서
  • 당신의 IMyService 인터페이스
  • 정의,를 추가 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(); 

이것은 처음 등록 된 구현을 제공하거나없는 경우 기본값을 제공합니다. 또는 확장 점 스키마에 메타 데이터를 더 추가하고이를 사용하여 사용자가 선택할 수있는 옵션 목록을 생성 할 수 있습니다.

게으른 로딩을 유지하기 때문에 선호하는 이클립스 방식이라고 생각합니다. 즉, 실제로 createExecutableExtension을 호출 할 때까지 사용자 정의 서비스 구현이있는 플러그인을 언로드 할 수 있습니다.

+0

여전히 싱글 톤 (플랫폼)을 사용하지만 실제로는 Eclipse 3.x를 사용하는 방법입니다. 이것은 e4에 대한 종속성 주입으로 변경됩니다 (실제로 확장됩니다). –

1

확장 프로그램이 올바른 것처럼 보입니다.

당신은 여전히 ​​ServiceTracker를을 만들은 OSGi와 함께 가고 싶은 경우

, 당신은 먼저 번들 컨텍스트가 필요합니다. 당연히 싱글 톤 액티베이터가있는 경우 일반 ( .getDefault().getBundle())을 얻는 것이 쉽고 간단합니다. 당신이 Platform.getBundle()를 사용하여 '기호 이름을 알고있는 경우

그러나, 당신은 당신의 번들을 찾을 수 있습니다. 이것은 또한 작동합니다.

관련 문제