Инъекция зависимостей / IOC при расширении Eclipse IDE - PullRequest
3 голосов
/ 12 сентября 2009

Предположим, я создаю очень простой плагин Eclipse для создания новых Java-проектов.

Я, очевидно, создам новый Мастер для точки расширения org.eclipse.ui.newWizards. Однако я действительно хочу позволить другим плагинам реализовать службу, которая управляет этим новым мастером.

Итак, теоретически у нас есть три плагина:

  • Мой «Основной плагин» (с MyNewWizard)
  • Мой "интерфейсный плагин" (с IMyService)
  • Мой плагин реализации (с MyServiceImpl)

Используя стандартные OSGI, я бы просто использовал сервисы из ServiceTracker.

К сожалению, я нахожусь в Eclipse OSGI, где я не могу создать свой класс мастера, передавая мой ServiceTracker, а скорее Eclipse делает мой плагин.

БЕЗ использования синглтона в моем активаторе, обеспечивает ли Eclipse какой-либо механизм IoC / Dependency Injection или, по крайней мере, способ запроса сервисов из этих классов UI?

Спасибо

Ответы [ 2 ]

3 голосов
/ 12 сентября 2009

Вот один из подходов, который вы могли бы использовать, и я думаю, что это довольно симпатичный способ сделать это.

  • Определите ваш IMyService интерфейс
  • В вашем плагине определите новую точку расширения, скажем "myplugin.myservice"
  • В схеме для этой точки расширения (PDE создаст ее для вас), добавьте элемент с именем «myService» с атрибутом «class» (или любым другим) и установите для его типа значение «java». Установите требуемый интерфейс (поле «Агрегаты») на 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, плагин с реализацией пользовательского сервиса может оставаться незагруженным.

1 голос
/ 12 сентября 2009

Точки расширения кажутся правильными.

Если вы все еще хотите использовать OSGi, чтобы создать ServiceTracker, вам сначала нужен контекст пакета. Естественно, если у вас есть синглтон-активатор, его легко получить (.getDefault().getBundle()).

Однако вы можете просто найти свой пакет, если знаете его символическое имя, используя Platform.getBundle(). Это тоже работает.

...