Архитектура плагинов - Создайте родительскую форму MDI, осознавая детей в DLL - PullRequest
3 голосов
/ 26 января 2010

Я экспериментирую с архитектурой плагинов для внутренней бизнес-системы моей компании. Мне удалось прочитать все .DLL в папке плагинов, которые реализуют определенный интерфейс. То, что я пытаюсь выяснить, - это лучший способ связи между родительским приложением MDI "host" и формами, которые будут в .DLL, которые я намереваюсь сделать детьми MDI.

В настоящее время я возвращаю только объекты ToolStripMenuItem из файлов .DLL для добавления в родительский объект MDI. Я также проверил, что события, связанные в .DLL с ToolStripMenuItems, распространяются на код в .DLL. Мне также удалось вернуть объект Form через интерфейс и открыть эту форму, так как папка плагина "сканируется".

Однако мне не ясно, как бы я сделал эти формы детей с ДИ. Кроме того, любые другие формы, живущие в .DLLs, также должны быть детьми MDI. Я создал проект надстройки VS 2008 просто для того, чтобы посмотреть, что происходит, и кажется, что надстройка принимает объект Application, над которым он добавляет ToolStripMenuItems, и выполняет другие операции. Код для построения меню внутри .DLL. Это противоположно тому, что я сделал до сих пор, когда MDI запрашивает ToolStripMenuItem из каждого .DLL и добавляет возвращаемый объект в свое собственное меню.

Будет ли проектирование моей архитектуры подключаемых модулей таким же образом, чтобы принимать объект приложения единственным способом, которым я мог бы открыть формы как дочерний элемент MDI? Я спрашиваю о других, в настоящее время неизвестных мне, головных болях, НЕ передавая объект приложения в .DLL?

1 Ответ

4 голосов
/ 28 января 2010

Несколько лет назад мы сделали нечто подобное. Как мы справились с этим, создав пару интерфейсов, которые были реализованы с помощью PluginManager и плагинов.

Менеджер плагинов реализовал интерфейс, подобный следующему:

    ''' <summary>
'''The IPluginManager interface is implemented by whatever component manages your gui
'''It provides a means for plugins to access GUI elements of the application
''' </summary>
Public Interface IPluginManager

    ''' <summary>
    '''The MDIForm property allows the plugin to display itself
    '''inside of the application's main MDI form (ie.  plugin.form.mdiparent=mdiform)
    ''' </summary>
    ReadOnly Property MDIForm() As Form
    ReadOnly Property Toolbar() As ToolBar

    ''' <summary>
    '''Allows the plugin to request that the application's main menu be updated
    ''' </summary>
    ''' <param name="Menu">The menu to add to the main menu</param>
    Sub UpdateMainMenu(ByVal Menu As Menu)

    ''' <summary>
    '''Allows the plugin to request that the application's workspace toolbar be updated
    ''' </summary>
    ''' <param name="Buttons">the collection of toolbar buttons to add to the toolbar</param>
    Sub UpdateToolbarButtons(ByVal Buttons As ToolBar.ToolBarButtonCollection)

End Interface

Плагины реализовали этот интерфейс:

    ''' <summary>
'''The IPlugin interface is implemented by all plugins
'''It provides a standardized means for the pluginmanager
'''to communicate with a plugin, without knowing the plugin explicitly
''' </summary>
Public Interface IPlugin

    ''' <summary>
    '''Allows the plugin to be intialized first before it asked to run
    ''' </summary>
    Sub Initialize()

    ''' <summary>
    '''Allows the pluginmanager to register itself with the plugin
    '''so the plugin can listen to events from the pluginmanager
    ''' </summary>
    ''' <param name="PluginManager">A plugin manager that implements the IPluginManager interface</param>
    Sub RegisterPluginManager(ByVal PluginManager As IPluginManager)

    ''' <summary>
    '''Requests the plugin to run its functionality
    ''' </summary>
    Sub Run()

End Interface

Как только приложение запускается, PluginManager находит все доступные плагины (похоже, у вас это уже работает), а затем создает экземпляр каждого плагина, регистрируя себя для каждого плагина. Затем PluginManager инициализирует, а затем запускает плагины.

На стороне плагина, когда Плагин инициализируется или запускается (в зависимости от ваших потребностей), вы просто устанавливаете свойство MDIParent формы плагина на MDIForm, предоставленную в интерфейсе IPluginManager. И Виола!

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...