[转载]最专业的通用.NET插件平台——尤埃开放服务平台介绍 – 道法自然 – 博客园.
尤埃开放服务平台(UIOSP)是基于.NET设计的插件化平台。该平台设计的初衷是: (1)为所有.NET应用环境设计一个通用的插件平台,即该平台能够以标准化的插件规范来开发基于.NET Framework的控制台应用、WinForm应用、ASP.NET应用、WPF应用、Windows服务应用及SilverLight应用和基 于.NET Compact Framework的移动应用设计;(2)为基于.NET的统一开放平台提供支持,即开发人员基于该平台设计的可完全复用的插件可以通过统一开放平台开放 给用户,这样开发者或者最终用户可以从该平台获取需要的模块然后组装成最终软件;(3)为企业构建一个基于插件库的标准化的软件生产线,用于支持软件产品 自动升级、远程部署、远程管理、统一版本、局部更新、知识积累。
UIOSP插件平台通过对.NET CLR进行扩展实现优雅的通用的插件化框架,它支持模块化与插件化、面向服务架构、模块扩展三大功能。模块化与插件化为.NET应用程序提供了物理隔离的 模块支持,它为每一个物理隔离的模块提供了标准的规范、隔离的目录结构、隔离的类加载器、多版本并存支持、插件依赖支持等功能;面向服务架构是实现模块化 通讯的手段,每一个模块通过服务总线来注册/查询绑定/卸载服务,服务是模块间交互的手段。在该平台,服务是可管理的,这意味着插件间的交互可以被管理和 监控。模块扩展功能为插件提供了可扩展机制,这样我们可以在不改变原有模块的代码情况下,来注入新的功能或更新原有功能。
你可以从插件平台这 个链接下载到该平台的安装包,一旦安装后,它将为你提供:(1)用户开发指南;(2)Visual Studio标准项目模板,可用于创建不同应用环境的主程序和插件;(3)基于Visual Studio的插件配置工具,用于插件可视化配置;(4)远程控制台,可用于查看插件内核的插件状况,动态安装/启动/停止/卸载插件。
下 图是基于该插件平台的软件系统的通用架构。在这里你根据应用系统的环境,创建相应的主程序,并利用UIOSP的BundleRuntime类来启动插件框 架。在UIOSP,插件用英语单词Bundle来表示,Bundle可以翻译为插件或者模块,而BundleRuntime就是插件运行时了,这与WWF 的WorkflowRuntime概念类似。一旦插件框架被启动,它将会加载位于plugins目录下的所有标准化的插件,并将插件组装成一个应用系统。 应用程序的开发可以按2个步骤走:(1)创建主程序;(2)创建插件。
下图则是基于插件库的企业级应用系统架构。在这里,企业将建立自己的私有插件/模块仓库,构建自己的产品生产线,使用一致的方式来构建、维护、部署、升级、管理软件产品。
接下来以一个Demo来演示一下如何来演示这个插件框架的使用方法。
首先运行Visual Studio,然后使用向导创建一个“UIOSP”=>“高级Windows窗体应用程序”项目。
这样你就使用UIOSP提供的项目模板创建了一个默认的WinForm插件主程序了。
你 可以发现创建的主程序包括:Program.cs启动类、bin/plugins目录及该目录下的三个默认插件。Program.cs类在这里完成的工作 很简单:(1)创建一个BundleRuntime并调用Start方法来启动插件内核;(2)从插件内核服务总线中获取一个类型为Form的服务,即主 窗体,然后运行该主窗体。一旦程序启动,那么在bin/plugins目录下的插件会被BundleRuntime加载并启动。这个项目里面有一个 WinFormShellPlugin插件,该插件是一个通用的WinForm主窗体,该主窗体实现了菜单、导航栏、内容区域、状态栏,并支持换肤。你可 以试一下启动这个程序,结果如下。
这 个主程序包含的WinFormShellPlugin插件已经为你提供了一个漂亮的防Office的Windows空的壳子。下面我们来试着开发一个应用 插件。回到Visual Studio,选中解决方案然后点击“添加新建项目”,选中“UIOSP”=>“高级Windows窗体插件”,命名为AppPlugin。需要注 意的是,这个AppPlugin插件项目必须位于bin/plugins目录下。
浏览一下这个AppPlugin插件项目,其内容如下。插件包含一个Activator.cs、Manifest.xml、一个窗体、一个用户控件和一个资源。
在 插件中,Manifest.xml是插件的配置文件,它用于声明插件的标识、名称、启动顺序、初始启动状态、本地类库、依赖的插件和类库、扩展信息。双击 插件,你可以使用基于Visual Studio的插件配置工具来查看和更改配置信息。如下图所示。它包含四个标签页:(1)基本:用于配置插件的基本信息;(2)运行时:用于配置插件需要 的类库、依赖的插件或依赖的插件的类库信息;(3)服务:用于配置插件提供的服务;(4)扩展:用于定义插件的扩展点和对其它插件的扩展信息。
按 F7可以查看Manifest.xml的源代码,如下所示。<Bundle>节点定义基本信息,<Activator>节点定义 指定插件执行入口和出口的类型,其定义就是这个项目的AppPlugin.Activator类型,<Runtime>指定了这个插件的本地 类库,<Extension>节点定义了对WinFormShellPlugin的扩展,它向这个插件的左边的导航栏注册了2个菜单和菜单点 击时显示的窗体/用户控件的类型。
2 <Bundle xmlns=”urn:uiosp-bundle-manifest-2.0″ SymbolicName=”AppPlugin” Name=”AppPlugin” Version=”1.0.0.0″ InitializedState=”Active”>
3 <Activator Type=”AppPlugin.Activator”/>
4 <Runtime>
5 <Assembly Path=”bin\AppPlugin.dll”/>
6 </Runtime>
7 <Extension Point=”UIShell.Applications”>
8 <Application Title=”AppPlugin” ToolTip=”AppPlugin” Icon=”AppPlugin.Resources.shell.png”>
9 <Menu Text=”UserControl1″ ToolTip=”UserControl1″ Icon=”AppPlugin.Resources.shell.png” Class=”AppPlugin.UserControl1″/>
10 <Menu Text=”Form1″ ToolTip=”Form1″ Icon=”AppPlugin.Resources.shell.png” Class=”AppPlugin.Form1″/>
11 </Application>
12 </Extension>
13 </Bundle>
这 个插件的Activator.cs文件定义了插件的入口和出口。当插件被启动时,这个类的Start方法会被调用并传入一个插件上下文参数 (IBundleContext);反之,如果插件被停止,Stop方法被调用。IBundleContext这个对象是插件与内核交互的唯一参数,你可 以通过它来注册/查询/绑定/卸载服务;可以通过它来或者这个插件对应的Bundle对象;可以通过它来查询插件内核的插件情况,动态安装/启动/停止 /卸载插件;可以监听插件内核的各种事件。接下来,你可以试着运行一下这个应用程序了。
你 可以看到,构建的插件向WinFormShellPlugin的导航栏注册了由“UserControl1”和“Form1”两个菜单项组成的 “AppPlugin”菜单组,一旦点击“UserControl1”菜单,这个用户控件就显示在右边的内容区域。随着你构建越来越多的插件,他们将向界 面中注册越来越多的菜单和窗体,那一个基于插件平台的具有漂亮界面的WinForm应用程序构建完成了。不过,还没完,下面你还可以试着使用远程管理控制 台工具来管理插件内核。为了更好演示动态性,我又创建了一个DemoPlugin插件。
在这里,你可以使用install/list/start/stop/uninstall指令来操作。首先,输入list来查看插件内核加载的情况。如下所示,它列出了5个插件,当然有一个没有显示,就是ID为1的系统插件。
接下来你可以使用stop 2/start 2/uninstall 2来停止AppPlugin/启动AppPlugin/卸载AppPlugin。下面看一下Stop 2指令即停止AppPlugin的效果。
你 可以发现AppPlugin这个插件已经被停止,它创建的菜单也从界面上消失。这就是UIOSP的另一重要特性:动态性!你可以通过远程控制指令来更改软 件的行为。有关UIOSP这个最专业的插件平台的介绍,先到这,后面我将介绍UIOSP构建的一个实际的案例——SaaS应用商店开放平台,它使用的是基 于插件仓库来构建的开放平台。
有任何问题欢迎加入UIOSP交流群进行讨论,群号:121369588。