Как правильно писать "плагинное" приложение?

Решил тут сделать веб-приложение такое, чтобы использовались плагины. Я на самом деле совсем не представляю форму ответа на мой вопрос, но возможно вы поделитесь ссылками по тематике «Как правильно писать „плагинное“ приложение?» или даже кто-нибудь напишет статью об этом на Хабр.
  • Вопрос задан
  • 3438 просмотров
Решения вопроса 1
VenomBlood
@VenomBlood
Посмотрите в сторону MEF и Unity (если говорить про .net), позволят создавать достаточно хорошие расширяемые системы.
Если смотреть с более общей точки зрения, то «плагинабельность» — это достаточно широкая и проработанная тема.
Тут встают вопросы: какая именно плагинабельность вам нужна?

Нужно ли взаимодействие на базе SOA? нужна ли изоляция плагинов в отдельный домен? Можете ли вы обойтись простой структурой подлкючения модулей, или надо использовать шину сообщений? Нужно ли разграничение по уровням доверия и, соответственно, раздельный API?
Также вопрос по поводу инъекции зависимостей — будут ли ваши плагины больше отдельными модулями, или они будут тесно интегрироваться в существующую среду (например плагин переопределяющий нотификацию) и возможно использование DI.

Краткого совета «как писать» здесь быть не может, нужно знать задачу и все нюансы.
Если говорить просто о каком-либо фреймворке для обеспечения плагинабельности — почитайте статьи про MEF, они на английском, но дадут общее представление об одном из возможных путей решения проблемы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Gorthauer87
@Gorthauer87
Программист
Создаем либу, которая предоставляет общее sdk, обычно это набор абстрактных классов. Создаем класс Plugin, который содержит в себе необходимые точки входа, обычно это init для того, чтобы плагин сказал о том, что он умеет, load для того, чтобы плагин начал выполнять возложенные на него фичи и unload, для выгрузки. Далее делаем менеджер этих самых плагинов, который имеет в себе указатели на все доступные плагины, он уже разруливает что загружать, а что нет, а также разруливает всякие штуки наподобии зависимостей между плагинами.
Работать такая связка будет столь же быстро, как и монолитное приложение, зато каждый плагин будет являться лишь кирпичиком и можно будет гораздо проще отлаживать. Такого рода незначительно влияет на скорость загрузки приложения (необходимо таки делать некоторые лишние телодвижения в рантайме) и незначительно на объем потребляемой памяти. Можно организовать обмен эвентами между плагинами, но гораздо проще и быстрее сделать плагины реализациями некоторых интерфейсов, а обмен событиями использовать лишь в небольшой части плагинов, где это реально нужно.
Ответ написан
schursin
@schursin
А посмотрите API и доки любого подобного и 90% вопросов отпадут сами собой.
Ответ написан
Комментировать
@MaratFM
В случае с питоном можно посмотреть в сторону Zope 3 (он же BlueBream), а также на компонентную архитектуру trac, и как вариант на расширения для mercurial

Если кратко их описать, то получится следующее:
Zope 3 — базируется на интерфейсах и адаптерах, данная концепция ближе к интерфейсам в яве, мне показалось излишне нагроможденной, исчезает красота питона;
Trac — основывается на компонентах и точках расширения, практически каждый блок является компонентом и связывается с другими через точки расширения, причем компонент который объявляет точки расширения так же описывает интерфейс, который должен реализовывать компонент использующий его;
Mercurial — позволяет расширять функционал через определение дополнительных команд, остальные изменения в функционалы через специальный хуки (могу ошибаться, т.к. не изучал подробно).


В общем, все зависит от задачи и средств, с помощью которых вы хотите их решать.
P.S. Самого беспокоят подобные вопросы, поэтому вэлком в личку.
Ответ написан
Комментировать
@AlpenColt
Всё зависит от ваших нужд и широты функционала плагина. Лучше всего посмотреть, как это реализовано в опенсорсных решениях, к примеру, могу посоветовать FireFox и расширения на XUL, как образец довольно гибкого способа изменения функционала приложения.

Также, стоит посмотрет в сторону шаблона Наблюдатель", который облегчит масштабируемость.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы