代码之家  ›  专栏  ›  技术社区  ›  HardCode

插件体系结构-使MDI父窗体了解DLL中的子窗体

  •  3
  • HardCode  · 技术社区  · 14 年前

    我正在为我公司的内部业务系统试验一种插件架构。我已经设法读取了插件文件夹中的所有.dll文件,这些文件实现了一个特定的接口。我试图找出的是“主机”MDI父应用程序和将在.dll中生成MDI子级的表单之间的最佳通信方法。

    然而,我不清楚我将如何使这些表格MDI儿童。此外,生活在.dll中的任何其他形式也必须是MDI儿童。我创建了一个VS 2008加载项项目,只是为了看看发生了什么,加载项似乎接受了一个应用程序对象,它在该对象上添加到ToolStripMenuItems并执行其他操作。在.DLL中构建菜单的代码。这与我到目前为止所做的相反,MDI从每个.DLL请求ToolStripMenuItem,并将返回的对象添加到它自己的菜单中。

    设计我的插件体系结构以同样的方式接受应用程序对象,这是我将表单作为MDI子级打开的唯一方法吗?我是不是因为没有将应用程序对象传递给.DLL而引起了其他我目前不知道的麻烦?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Walter    14 年前

    几年前我们做了类似的事情。我们是如何处理它的,我们创建了几个接口,这些接口由一个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初始化并运行插件。