三分钟实现一个插件平台和一个插件——基于最简单的OSGi.NET插件框架
2010-06-22 02:06
1071 查看
你相信三分钟能实现一个插件平台和一个插件吗?在这里我将演示一下史上最简单的插件框架。这个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()方法,参考示例如下:
1 public class Activator : IBundleActivator
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.");
}
}
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实现对插件和服务基础支持等一系列功能。
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()方法,参考示例如下:
1 public class Activator : IBundleActivator
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.");
}
}
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实现对插件和服务基础支持等一系列功能。
相关文章推荐
- 分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法
- Java.NET --一个基于Java的Microsoft.NET框架的实现
- .net平台 基于 XMPP协议的即时消息服务端简单实现
- 一个简单的AJAX实现,基于C#的ASP.Net,包括服务器端的程序代码
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现
- Java实现一个简单的RPC框架(五) 基于Socket的传输层实现
- 最简单的OSGi.NET插件框架
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 实现插件
- 基于akka与scala实现一个简单rpc框架
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答 推荐
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
- 一个简单的AJAX实现,基于C#的ASP.Net,包括服务器端的程序代码
- 基于vue实现一个简单的MVVM框架
- .net平台 基于 XMPP协议的即时消息服务端简单实现
- 使用Net类库,实现的基于TCP/IP简单的通讯框架框架(一)
- aop框架的一个简单实现
- [综合] 一个简单图形界面框架XYGui的设计与实现 (二)
- [ZooKeeper.net] 1 模仿dubbo实现一个简要的http服务的注册 基于webapi
- 基于jQuery实现一个marquee无缝滚动的插件