2010-01-25 1 views
3

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

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

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

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

+0

Мне интересно делать что-то подобное. Вы когда-нибудь получали эту работу? Я не уверен, как заставить хост-форму контролировать папку, и как только она это сделает, как заставить ее проверить правильный интерфейс для добавления плагина. Не могли бы вы опубликовать сообщение, если бы не ссылка на ваш код, а может быть, немного пример кода для того, как вы это сделали? –

ответ

4

Несколько лет назад мы сделали что-то подобное. Как мы справились с этим, создав пару интерфейсов, которые были реализованы с помощью 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 Intializes, а затем запускает плагин (ы).

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

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

+0

Не могли бы вы разместить примеры дочерней формы, реализующей интерфейс? –

Смежные вопросы