你相信三分钟能实现一个插件平台和一个插件吗?在这里我将演示一下史上最简单的插件框架。这个Demo以控制台为例,实现一个基于控制台的插件框架和一个控制台插件。当然,除了能三分钟开发一个控制台插件平台和插件,你还可以开发WinForm和Web,该框架完全兼容控制台、WinForm和ASP.NET应用系统,开发过程、开发规范完全一致。OK,我们直切主题。
1 控制台宿主——控制台插件框架
1) 在Visual Studio 2008中创建一个名为ConsoleShell1的命令行宿主应用程序。
2) 此时自动生成ConsoleShell1项目结构如下,它由一个Program.cs主程序和位于bin/plugin下的系统服务插件构成。该项目在Main方法中通过调用BundleRuntime.Start方法启动插件框架,然后加载运行所有插件。
3) 编译运行解决方案,此时的ConsoleShell只加载了几个系统的服务模块,使用UIShell.OSGi Remote Management Console来远程监控插件平台的结果如下。在控制台上输入list或者l命令,可以查看到目前启动了框架和6个系统服务模块。
该远程管理控制台通过ConsoleShell加载的RemotingManagement模块暴露的WebService来管理远程框架运行状况。目前,它支持从远程安装、启动、停止、卸载、查询模块等功能。(声明:该控制台工具是基于EgeyeAddin 开源产品的ConsoleService来做,由于时间比较紧直接重用EgeyeAddin中ConsoleService大部分源代码,在此表示感谢。此外,我们还用了NDigester这个开源组件用于解析XML文件。)
到此为止,一个控制台插件框架便架构完成了。
2 控制台插件
1) 继续在1中所演示的工程中添加一个ConsolePlugin项目,命名为ConsolePlugin1。注意其位置是指向 Console Shell1\bin\plugins目录。
2) 此时生成的项目内容如下,它由模块激活器Activator.cs文件和模块清单文件Manifest.xml组成。
3) 修改Activator类的Start()和Stop()方法,参考示例如下:
2 {
3 public void Start(IBundleContext context)
4 {
5 Console.WriteLine( " ConsolePlugin1 is active. " );
6 }
7 public void Stop(IBundleContext context)
8 {
9 Console.WriteLine( " ConsolePlugin1 is stopped. " );
10 }
11 }
4) 至此,一个基本的Plugin示例已经建立完毕。
5) 编译整个解决方案,并运行上节建立的控制台应用程序,结果如下:
6) 运行远程管理控制台,运行list命令,结果如下,此时ConsolePlugin1已经被架加载并处于Active状态。
7) 在远程管理控制台输入“stop 3”来停止该模块,结果如下:
此时,ConsolePlugin1进入Resolved状态并在ConsoleShell运行的控制台上输出“ConsolePlugin1 is stopped.”信息。
这样一个插件也实现了!以下是这个过程涉及的名词的简单介绍。
3 宿主简介
插件框架是在公共语言运行时之上的模块运行时框架,需要由宿主启动和停止。也就是说,宿主是启动和停止模块运行时的程序,通过这种方式宿主就继承了插件框架动态插件化的所有特性。它支持各种类型的宿主,包括控制台、WinForm和ASP.NET等。控制台宿主为所有的插件提供了一个基于控制台的运行环境,而WinForm则相应的提供了一个桌面应用环境和网络应用环境。
4 激活器简介
激活器(Activator)是插件平台启动插件的入口/出口点,即在启动模块时会调用激活器的Start()函数,如果调用成功,模块将进入Active状态;当定制模块时会调用Stop()函数,一旦调用成功,模块将进入Resolved状态。因此插件可在激活器中实现预处理/清理功能,例如在Start()中模块可向服务总线注册服务,其它插件则可在此获取共享的服务;此外还可以在这里执行启动线程等其它操作。
5 Manifest简介
Manifes.xml包含了各个插件或服务所包含的私有定义, 依赖声明, 扩展及扩展点信息等, 是插件向底层框架暴露自己的唯一途径, 平台可以通过Manifest实现对插件和服务基础支持等一系列功能。