Какую архитектуру плагина использовать

Я хочу создать механизм расширения плагина для очень общего приложения, которое имеет много аспектов и множество различных функций.

Немного подробнее о том, что я разрабатываю:

  • У меня есть приложение с графическим интерфейсом, и я хочу предоставить много точек расширения. Я хочу добавить меню, действия, кнопки панели инструментов и т. д.
  • У меня есть некоторые службы без графического интерфейса, которые отслеживают изменения в редактируемых данных и т. д. Я хочу зарегистрировать такие службы.

Я рассматриваю Equinox (в качестве примера, я не могу использовать его из-за ограничений приложения) и его очень хороший механизм расширяемости, который включает в себя расширения и точки расширения. Какие проблемы с этим подходом? Какие альтернативные решения этой проблемы доступны?


person Konstantin Solomatov    schedule 10.11.2012    source источник
comment
Этот вопрос требует обсуждения и мнения и не подходит для SO. В разделе Часто задаваемые вопросы ясно упоминаются вопросы такого типа как плохо подходящие для дизайна здесь. Голосование за закрытие как неконструктивное. Если вы хотите найти другие подобные механизмы, используйте поисковую систему — Google и Bing отлично подходят для этой цели.   -  person Ken White    schedule 11.11.2012
comment
@KenWhite Я переформулировал вопрос, чтобы он был менее расплывчатым.   -  person Konstantin Solomatov    schedule 11.11.2012


Ответы (3)


Что касается расширяемости пользовательского интерфейса, eclipse RCP, безусловно, предоставит множество возможностей в этой области.

Для нижних уровней это звучит так, как будто вы смотрите на OSGi, для которого Equinox является просто одной из многих возможных сред выполнения. Если вы придерживаетесь кодирования в соответствии со спецификацией, то можете использовать Equinox, Felix... или любую другую реализацию для своего приложения.

Вы на самом деле не определили, что вы ищете, когда говорите о расширяемости, и с таким открытым вопросом вы поднимаете его, будучи закрытым.

person Robin    schedule 11.11.2012

Какое приложение вы пишете? Механизм расширений и точек расширения eclipse является собственной концепцией eclipse rcp. Так что, если вы пишете eclipse rcp gui, то это правильный путь.

Если вы пишете серверное приложение, то сервисы OSGi подходят гораздо больше. В случае серверного приложения я рекомендую использовать Apache Karaf вместо Equinox. Karaf может запускать Equinox как платформу OSGi, но он также предоставляет множество дополнительных функций, таких как развертывание из репозиториев maven и поддержка ведения журналов. вот небольшой учебник о том, как написать простое серверное приложение с использованием OSGi и Apache Karaf. Он показывает, как использовать службы OSGi для разделения API и реализации.

Для расширяемости вы, вероятно, захотите использовать один API и более одной реализации службы. Это также возможно. Вы можете получить список сервисов для интерфейса, а также можете получать уведомления о добавленных и удаленных сервисах.

person Christian Schneider    schedule 11.11.2012
comment
Я добавил больше деталей в описание. - person Konstantin Solomatov; 11.11.2012
comment
Так что для eclipse rcp gui вы должны быть на правильном пути с расширениями. Не уверен, что это в полной мере верно для Eclipse 4, поскольку сейчас большая часть инфраструктуры также построена на службах OSGi. - person Christian Schneider; 11.11.2012

Одна проблема, о которой следует помнить при переходе на OGSi, заключается в том, что он использует загрузчик классов для каждого пакета (= модуля), чтобы изолировать пакеты друг от друга. Это часто доставляет неудобства, особенно при работе с библиотеками, которые не предназначены для использования в среде OSGi. В конце концов, почти все возникающие проблемы с загрузкой классов могут быть решены, но это может занять довольно много времени, чтобы разобраться во всем.

Вы также можете использовать Spring, чтобы сделать вашу программу модульной и расширяемой. Контексты приложения Spring могут быть вложены, так что «модуль» может использовать Spring bean-компоненты своего родителя, но не наоборот. Можно сказать, что Spring автоматически обнаруживает файлы контекста приложения всех jar-файлов в пути к классам. Чтобы смоделировать точки расширения eclipse с помощью этого подхода, один модуль может предоставить bean-компонент с методом «register», который другие модули могут использовать для подключения.

Использование службы из другого модуля будет таким же простым, как получение ссылки на сервисный компонент в spring (при условии, что иерархия контекста приложения настроена соответствующим образом).

person mbelow    schedule 27.11.2012