Какова основная идея позади Плагинов? [закрытый]

Еще один подход: используйте Пиротехническое средство (объекты ремоутинга Python).

Пиротехническое средство в основном позволяет Вам публиковать экземпляры объектов Python как сервисам, которые можно назвать удаленно. Я использовал Пиротехническое средство для точной цели, которую Вы описываете, и я нашел, что это работало очень хорошо.

По умолчанию, демон сервера Пиротехнического средства принимает соединения отовсюду. Для ограничения этого, любое использование блок проверки допустимости соединения (см. документацию), или предоставляют host='127.0.0.1' к Daemon конструктор, чтобы только прислушаться к локальным соединениям.

Пример кода, взятый из документации Пиротехнического средства:

Сервер

import Pyro.core

class JokeGen(Pyro.core.ObjBase):
        def __init__(self):
                Pyro.core.ObjBase.__init__(self)
        def joke(self, name):
                return "Sorry "+name+", I don't know any jokes."

Pyro.core.initServer()
daemon=Pyro.core.Daemon()
uri=daemon.connect(JokeGen(),"jokegen")

print "The daemon runs on port:",daemon.port
print "The object's uri is:",uri

daemon.requestLoop()

Клиент

import Pyro.core

# you have to change the URI below to match your own host/port.
jokes = Pyro.core.getProxyForURI("PYROLOC://localhost:7766/jokegen")

print jokes.joke("Irmen")

Другой подобный проект RPyC. Я не попробовал RPyC.

6
задан Community 23 May 2017 в 11:48
поделиться

8 ответов

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

Существует несколько способов, которыми фактически работает подключаемая архитектура, но в целом , это шаги:

  1. Плагины разработаны для соответствия интерфейсу , который ожидает приложение. Например, простое приложение может требовать, чтобы плагины реализовывали интерфейс IPlugin .
  2. Плагины загружаются приложением, обычно при запуске приложения
  3. Плагины часто предоставил доступ к большей части данных, которыми управляет приложение. Например, плагины Firefox могут получить доступ к текущей веб-странице, а плагины Eclipse могут получить доступ к открытым файлам.

Вот два способа (из нескольких), которыми приложение может находить плагины:

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

Когда подключаемые модули обнаруживаются, они загружаются приложением (иногда это задача загрузчика классов ).

Архитектор программного обеспечения может спроектировать подключаемая архитектура, когда они ожидают, что либо поставщик программного обеспечения, либо сообщество пользователей будут реализовывать новые функции, которые изначально не были частью системы. Два отличных примера - Eclipse и Firefox; другие приложения включают Adobe Photoshop (для художественных приемов и графических инструментов) и Winamp (для визуализации).

и приложение знает, что нужно загружать подключаемые модули из этой папки
  • Каждый подключаемый модуль работает как служба, и службы предназначены для совместной работы (так работает приложение на основе OSGi)
  • Когда подключаемые модули обнаружены, они загружаются приложением (иногда это задача загрузчика классов ).

    Архитектор программного обеспечения может разработать архитектуру подключаемого модуля, если он ожидает, что либо поставщик программного обеспечения, либо сообщество пользователей будет реализовывать новые функции, которые изначально не были частью системы. Два отличных примера - Eclipse и Firefox; другие приложения включают Adobe Photoshop (для художественных приемов и графических инструментов) и Winamp (для визуализации).

    и приложение знает, что нужно загружать подключаемые модули из этой папки
  • Каждый подключаемый модуль работает как служба, и службы предназначены для совместной работы (так работает приложение на основе OSGi)
  • Когда подключаемые модули обнаружены, они загружаются приложением (иногда это задача загрузчика классов ).

    Архитектор программного обеспечения может разработать архитектуру подключаемого модуля, если он ожидает, что либо поставщик программного обеспечения, либо сообщество пользователей будет реализовывать новые функции, которые изначально не были частью системы. Два отличных примера - Eclipse и Firefox; другие приложения включают Adobe Photoshop (для художественных приемов и графических инструментов) и Winamp (для визуализации).

    они загружаются приложением (иногда это работа загрузчика классов ).

    Архитектор программного обеспечения может спроектировать архитектуру подключаемых модулей, если он ожидает, что либо поставщик программного обеспечения, либо сообщество пользователей будут внедрять новые функции, которые изначально не были частью системы. Два отличных примера - Eclipse и Firefox; другие приложения включают Adobe Photoshop (для художественных приемов и графических инструментов) и Winamp (для визуализации).

    они загружаются приложением (иногда это работа загрузчика классов ).

    Архитектор программного обеспечения может спроектировать архитектуру подключаемых модулей, если он ожидает, что либо поставщик программного обеспечения, либо сообщество пользователей будут внедрять новые функции, которые изначально не были частью системы. Два отличных примера - Eclipse и Firefox; другие приложения включают Adobe Photoshop (для художественных приемов и графических инструментов) и Winamp (для визуализации).

    6
    ответ дан 8 December 2019 в 13:47
    поделиться

    Я никогда не писал систему плагинов. Но вот как я представляю себе это в своей голове:

    • В вашей программе есть подкаталог для плагинов (например, «C: \ Program Files \ My Program Name \ plugins»).
    • Вы создаете плагины в виде файлов DLL и размещаете их в папке плагинов.
    • Эти библиотеки DLL будут экспортировать функции с предопределенными именами.
    • Когда вы запускаете свою программу, она просматривает все библиотеки DLL в папке плагинов. В каждом из них он будет искать экспортируемую функцию с определенным именем (например, «Загрузить») и вызывать эту функцию. Затем плагин может выполнить любую настройку, которую ему нужно сделать.
    • Затем программа вызовет экспортируемую функцию в плагине с именем вроде "GetPluginName". Плагин вернет его имя, и программа сможет использовать это имя при отображении пользователю списка плагинов.
    • Когда приходит время вызвать плагин, программа вызовет другую экспортированную функцию (возможно, «Активировать») и, вероятно, передаст плагину указатель на данные, с которыми плагин будет работать. Затем программа выполнит свою работу с данными.
    • Плагин может также экспортировать другую функцию, которую программа будет вызывать для отображения диалогового окна настройки, в котором вы можете изменить параметры плагина.
    1
    ответ дан 8 December 2019 в 13:47
    поделиться

    Программа обычно должна быть разработана для поиска подключаемого модуля, а подключаемый модуль- У него должна быть стандартная точка доступа, чтобы принимать управление от основной программы. Каждое приложение или веб-сайт делают это немного по-своему.

    Доступ к простейшему типу подключаемого модуля осуществляется примерно так:

    if (a plug-in exists/is configured)
      call predefined plug-in code
    

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

    perform application specific logic
    if any plug-in exists that exposes the run_after_app_specific_logic function
      call plug-in code
    

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

    1
    ответ дан 8 December 2019 в 13:47
    поделиться
    1. Создайте интерфейс , который будут реализовывать все плагины определенного типа.
    2. Напишите код, который будет «использовать» плагин только для интерфейса.
    3. Имейте динамический способ загрузки библиотеки DLL, содержащей тип подключаемого модуля, реализующего ваш интерфейс (например, иметь настраиваемое расположение папки, чтобы проверить, содержат ли какие-либо библиотеки DLL в этой папке какие-либо типы, реализующие ваш интерфейс, и динамически загружать все, что есть. В .NET здесь может использоваться Assembly.LoadFile () )

    Если вы хотите взглянуть на какой-то исходный код, Paint.NET является бесплатным и открытым исходным кодом и имеет архитектуру плагинов. .

    7
    ответ дан 8 December 2019 в 13:47
    поделиться

    Система подключаемых модулей может быть реализована разными способами, но наиболее распространенным способом для многих приложений C / C ++ является SDK подключаемых модулей на основе DLL.

    Библиотека DLL предоставляет различные автоматизированные функции вызовы, которые могут позволить плагину «настроить себя» в работающем приложении, например, добавление пунктов меню, новых функций или дополнительных опций для систем (например, реализации 3D-рендеринга).

    0
    ответ дан 8 December 2019 в 13:47
    поделиться

    Более того, в этом нет необходимости в каких-либо специальных открытиях - механизм плагинов, как правило, тупой: вот подпись кода, которую я понимаю, а вот звонок (ы) я могу сделать. Я понятия не имею, как то, что я звоню, выполнит эту работу, но я ожидаю, что результат будет в определенном формате. И это в значительной степени контракт. Теперь - плагин выполнит контракт и станет доступным. В Java, например, «сделать доступным» просто означает, что реализующие классы загружаются в память. Драйвер JDBC для конкретной базы данных может быть хорошим примером.

    0
    ответ дан 8 December 2019 в 13:47
    поделиться

    Eclipse в примере платформы приложения, которая полностью плагин- based, что означает, что все функции реализованы в виде плагинов. Внизу есть тонкий слой для запуска / выключения и управления плагинами, но все остальное реализовано как плагины поверх него. В результате получается структура, которую можно использовать практически для всего. Более подробную информацию об архитектуре плагинов Eclipse можно найти здесь: http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html .

    1
    ответ дан 8 December 2019 в 13:47
    поделиться

    Это очень зависит от языка.

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

    В C довольно сложно обойтись без посторонней помощи. В окнах C + "DLL" может быть подключаемым модулем и часто используется таким образом.

    В объектно-ориентированном языке с отражением вы можете создать объект, реализующий интерфейс, и загрузить его в режиме отражения. После загрузки вы можете игнорировать тот факт, что это был подключаемый модуль, потому что он обрабатывается как любой другой объект в вашем коде.

    .net имеет архитектуру подключаемого модуля (это COM?) В любом случае COM можно использовать как ( есть?) система плагинов.

    Ваш вопрос, вероятно, слишком открытый из-за всех возможностей. Однозначного ответа нет.

    1
    ответ дан 8 December 2019 в 13:47
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: