白话插件框架原理Word文件下载.docx

上传人:b****5 文档编号:16134566 上传时间:2022-11-20 格式:DOCX 页数:19 大小:1.68MB
下载 相关 举报
白话插件框架原理Word文件下载.docx_第1页
第1页 / 共19页
白话插件框架原理Word文件下载.docx_第2页
第2页 / 共19页
白话插件框架原理Word文件下载.docx_第3页
第3页 / 共19页
白话插件框架原理Word文件下载.docx_第4页
第4页 / 共19页
白话插件框架原理Word文件下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

白话插件框架原理Word文件下载.docx

《白话插件框架原理Word文件下载.docx》由会员分享,可在线阅读,更多相关《白话插件框架原理Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。

白话插件框架原理Word文件下载.docx

以传统模式开发的程序,一般情况下,不管是我们开发的程序集,还是引用的第三方程序集,它们都在应用程序的bin目录下,如下所示。

插件化开发方式与传统方式不同在于,它会把程序集按照一定结构进行组织,比如下面这个程序是基于插件化方式来构建的,不同功能的程序集则组织到Plugins目录下,如下所示。

此时,bin目录则仅仅包含几个很通用的程序集。

在Plugins目录下,则按照功能进行分组,每一个目录为一个插件,它实现一组功能。

下面我们来看其中一个插件——AlarmManagementPlugin插件的目录结构,如下所示,你会发现,插件拥有自己独立的bin目录,在自己的bin目录下,放置着这个功能涉及的程序集。

在传统开发方式中,放在bin目录下的程序集会由.NET类加载器按需去加载,但是当我们要实现插件化方式开发时,需要依赖于插件框架实现从不同的插件目录中加载程序集。

因此,插件框架本质上是扩展了.NET类加载器的功能,使其能够从插件目录中加载程序集。

2进一步看插件框架

插件化开发方式不仅仅从程序集的组织方式上发上了变化,更重要的是,在功能的组织和实现也发生了变化。

我们用一个非常典型的分层架构看看二者区别。

下图是一个分层架构的应用程序,由表示层、业务层、数据层等组成,每一个层次都有相对应的功能组成,在表示层,我们一般是构建了一个主界面,然后由不同的开发者在主界面上直接放置上菜单及菜单点击事件的响应,同理,其它层次也类似,不同开发者根据需要实现的功能来添加不同的代码。

在这种模式下,所有程序员开发的不同层次的功能代码一般都在同一个程序集里面,在开发过程中,团队需要不停的进行合并,并执行集成测试。

下图是大家都很熟悉的PetShop的项目结构。

这里面BLL程序集(项目)放置的是业务逻辑层的代码,Web程序集(项目)放置的是表示层代码,DALFactory及涉及的其它DAL程序集则是数据访问层的相关代码。

下面我们来看看一个功能所涉及的程序集。

这意味着,所有程序员都需要获取到项目的代码,然后遵循规则,在各个项目中添加自己的代码,再将这些代码合并起来,最后完整编译再交付软件系统。

现在我们来看看使用插件化开发方式的组织方式,如下图所示。

在这种模式下,功能被封装到插件中,一个程序员负责若干个插件,每一个插件由其相应功能涉及的界面、业务逻辑和数据访问等代码组成。

每一个插件可以独立开发、测试和部署,开发者间不再需要对代码进行合并。

下图是一个插件化应用程序的项目。

在这里,每一个插件完成一组功能,它们可以有自己独立的界面、业务逻辑和数据访问实现,插件间具有物理隔离性,开发者可以独立开发自己的功能,独立测试、部署与升级,一旦开发完成后,可以由插件框架在进行组合,不再需要进行代码合并和整体发布。

从简单示例看插件化

现在我们看看使用插件化来开发的示例。

下图是该软件的集成后的界面,有5个一级菜单,其中“服务器”为GPRS通讯服务器插件定义,由程序猿A开发;

“基础数据、能耗分类、安装数据”菜单为基础数据管理插件定义,由程序猿B开发。

下图是“服务器”的子菜单和其中一个页面。

下图是“基础数据”的子菜单和其中一个页面。

该系统使用插件化开发方法如下。

(1)该系统使用了一个通用界面框架插件,你可以从iOpenWorks网站来下载到该插件(

?

<

ExtensionPoint="

UIShell.WpfShellPlugin.LinkGroups"

>

LinkGroupDisplayName="

服务器"

DefaultContentSource="

UIShell.EcmCommServerPlugin.CommServerUserControl"

LinkDisplayName="

通讯服务器"

Source="

UIShell.EcmCommServerPlugin.IntegratedCommServerUserControl"

/>

测试服务器"

/LinkGroup>

/Extension>

(2)程序猿A创建一个自己的项目来开发通讯服务器,独立的实现具体的应用和业务逻辑,其项目结构如下所示。

在这里,他分成两个项目来实现GPRS通讯服务器,一个是界面表示层UIShell.EcmCommServerPlugin项目,另一个是业务逻辑层UIShell.EcmCommServerService项目。

在开发过程中与程序猿B互相独立,他们可以独立开发、测试、部署和维护。

运行这个项目后,程序猿A得到以下的结果。

(3)同理,程序猿B也创建一个自己的项目来开发基础数据管理,独立的实现具体的应用和业务逻辑,其项目结构如下所示。

在这里,他分成两个项目来实现,一个是界面表示层UIShell.EcmConfigurationPlugin项目,另一个是业务逻辑层UIShell.EcmDomainService项目,该项目可以被A来重用。

在开发过程中与程序猿A互相独立,他们可以独立开发、测试、部署和维护。

运行这个项目后,程序猿B得到以下的结果。

(4)程序猿A和B开发到一个阶段的时候,就可以来随时发布自己的插件,点击项目右键,直接将插件发布到插件仓库。

以下是发布的结果,该项目的插件仓库由3个项目组成。

通讯服务器项目的插件列表如下。

配置管理项目的插件列表如下所示。

(5)测试人员/部署人员可以通过插件管理来获取到这两个程序猿开发的插件,然后将这些插件下载组装起来。

下载安装后,就是如下的效果了。

4插件化有什么好处

从以上简单的例子,我们看到,插件化最直接的好处就是可以以模块化的方式来独立并行构建软件系统,在构建的过程中可以随时进行集成。

下面我把使用插件化的优点总结一下:

(1)插件化优化了团队协作,避免团队开发过程中互相交叉,不再需要更改各自的代码将开发的成果集成到一起;

(2)使用插件化开发后,每一个人的工作都非常的独立,可以有独立的架构、独立开发、独立测试、独立部署、独立升级,并行构建;

(3)插件化使得重用度更高,在我们开发的一个项目中,超过50%的模块都直接重用了原有的结果,不需要更改任何的代码;

(4)插件化使开发和维护更加简单,这也是得益于每一个开发人员可以单独开发自己的应用,每个人都很专注,并且只需要关注系统中很小的一部分,在以上示例中,每一个开发人员能看到的代码都是自己来开发的;

(5)使用插件化开发,我们的发布、升级也很简单,右键发布到插件仓库,部署测试人员通过插件管理界面来下载每一个人的成果,组装成软件,并且可以随时升级,这避免了很多手工发布、集成;

(6)使用插件化,可以很容易的构建自己的知识库,是完全可复用,并持续不断改进和增长。

5插件框架原理

从上述小节,我们看到,插件化开发更多的是软件方法和思想上的改变。

为了满足这种开发方法的团队协作模型,插件框架需要来解决一下几个问题:

5.1如何实现模块化

实现模块化,意味着我们需要把功能相关的类组织到若干独立的程序集,这些程序集是在插件目录下。

因此,实现模块化就必须解决以下几个问题:

(1)正确的类加载:

即插件框架必须对CLR类加载进行扩展,使其能够从插件目录中正确加载到插件程序集;

(2)插件描述:

必须引入一个插件描述方法,它来告知当前插件的基本信息、版本标识、以及这个插件所包含的程序集;

(3)解决插件的依赖关系:

在一个实际应用系统中,必然存在相互依赖。

在这里,依赖是指一个插件使用了另一个插件定义的类型或者创建的对象。

也就是说,我们可以直接使用另一个插件定义的类型,在更加麻烦的场景中,还存在循环依赖。

插件框架够必须很好的处理好插件依赖关系的解析与管理。

只有当所有的依赖关系都满足后,一个插件才能够对外暴露功能;

(4)类加载空间定义:

插件既有自己的程序集,也可以依赖其它插件的程序集,那这时候就必须对插件的类型空间做一个唯一的定义,保证当前插件能够加载的类型独立性和隔离性;

(5)插件多版本问题:

由于一个插件应用系统中的插件是由若干团队开发,每一个团队独立开发自己的插件,很有可能一个插件使用了NLog的1.0版本呢,而另一个团队则更新到最新的1.1版本,这时候,我们必须保证两个团队的插件能够正确运行;

(6)插件状态的定义:

插件可以具备不同的状态,并在不同状态下有不同的体现。

最常用的有:

安装、解析、正在启动、激活、正在停止、卸载等,当插件处于解析状态表示这个插件所有依赖关系都已经满足,可以被正常启动;

当插件处于激活状态则表示这个插件已经被启动,所有功能都已经暴露了;

(7)插件启动初始状态和启动顺序:

当插件被框架加载时,插件处于什么状态;

用什么样的方式来设置插件的启动顺序;

当插件有依赖关系时,这时候对启动顺序又有什么影响;

(8)插件的初始化和终止处理:

即相当于插件的入口和出口,当插件被启动或停止需要执行的操作是如何来定义的。

5.2如何实现模块通讯

插件框架必须解决模块通讯。

传统的通讯,我们都是基于CLR类加载来实现的,即我们可以直接引用另一个程序集的类型,比如:

ClassAcls=newClassA();

或者ClassA.Singleton.SayHello()。

插件框架可以提供两种通讯方式,如下:

(1)传统通讯方式:

即我们可以像以前一样,直接通过引用类型来进行通讯,或可以通过动态加载类型使用反射来通讯;

(2)面向服务:

基于SOA模型来实现通讯,即服务=服务契约(接口)+实现(类),服务提供商将服务注册到总线,服务消费者使用服务契约从服务总线获取服务,绑定使用。

5.3如何实现模块扩展

模块扩展指的是在不更改已经发布的插件的任何代码的情况下,来变更该插件的功能。

这也是插件重用的支撑之一。

在OSGi.NET插件框架,使用了基于ExtensionPoint-Extension机制,暴露扩展点的插件可以被扩展,扩展的插件通过XML来定义Extension的内容,从而被暴露扩

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1