标签:
OSGi是Open Service Gateway Initiative的缩写,Wiki对其的定义为:一方面它指OSGi Alliance组织,它是由IBM、Oracle、BEA、SAP等国际IT巨头组成的OSGi联盟组;另一方面指该组织制定的一个基于Java语言的服务规范——OSGi服务平台(Service Platform)。OSGi服务平台是一个动态的模块化框架:支持模块化与插件化、具有热插拔与动态特性、支持SOA、支持模块扩展、提供安全性支持等。
OSGi.NET插件框架提供了模块化与插件化、面向服务架构和模块扩展三大功能,适用于控制台、WinForm、Windows服务、WPF、ASP.NET和移动平台等任意.NET应用环境。
OSGi.NET是OSGi规范移植到.NET平台的服务规范。UIOSP是XAUI Open Service Platform缩写,即尤埃开放服务平台,它是OSGi.NET规范的实现,由西安尤埃信息技术有限公司提供。UIOSP完整实现了OSGi规范的移植,提供了模块化与插件化、面向服务架构支持、模块可扩展支持三大功能。UIOSP完善支持控制台应用程序、Windows服务应用程序、Windows窗体应用程序、WPF应用程序和ASP.NET应用程序等各种运行环境,并且支持Windows Mobile。
本文将让您体验使用Visual Studio.NET 2008 SP1 + SQLServer 2005 Express如何一步一步的基于UIOSP构建一个ASP.NET插件应用程序。目前UIOSP支持VS2005 SP1+/VS2008+/VS2010+开发环境,支持.NET Framework 2.0
1.1OSGI.NET 插件的程序结构:
基于OSGi.NET插件框架的应用程序体系结构如下图所示。在这里,应用程序由主程序和插件组成。主程序是具体的应用环境的入口,它用于启动OSGi.NET插件框架并进入插件框架暴露出来的入口点;应用插件则是实现软件不同功能的业务模块。
1.2 OSGi.NET插件框架优点:
2.1 模块化和插件化的特点:
核心思想是封装,即逻辑和物理兼顾的封装。逻辑封装,即OOP干的事儿,封装变化,面向接口编程。要真的应用在具体业务逻辑上时,是得需要花些功夫和实践的,对于OSGi的最佳实践来说,尤其重要。
物理 封装,即“物理隔离”,隔离的层次级别很低,到了具体的实体文件。首先,不像是普通的.NET程序,如WinForm,默认情况下,功能程序集文件都必须是在bin目录下,和主程序一块儿,如Web,文件都是在同一个目录层次中,核心逻辑也是在这个启动路径的bin目录中,他们是紧密联系的,无法分开存放的。OSGi的目录结构是可以自定义的,当然这些路径都是在一个已经定义好的范围之内,在这个范围内任意位置的程序集都可以被访问的到。比如你可以把主程序放在C盘,功能模块文件放在D盘。原理上讲,就是OSGi.NET改变了.NET默认的加载顺序和机制,允许程序动态加载指定路径的程序集。
其次,就是物理级别的“封装变化”,对于一个程序来说,每个子功能模块,根据需求的不同,对整体而言是可变的,也是不停变化的,以前只是将逻辑封装在一个程序集里,那么是否可以将多个关联程序集再封装在一个“模块”里呢?以前是内部的封装,现在是内部和外部一起封装,更抽象的封装。逻辑封装的表现形式是一个程序集,通常就是一个具体名字的dll,这里物理的封装就是一个具体名字的文件夹,在这个文件夹里包含了他所需的多个基本的程序集。理论上说,最佳场景应该是逻辑上、物理上与其他封装好的模块之间相互独立且隔离的,这样的话,我们能很简单的从文件结构上提炼出模块之间的关系以及整个软件功能的组成,这为以后的更新、维护、部署甚至重用都带来了好处。比如一个WinForm上的封装好的数据访问模块可以直接复制到一个Web上无需改动,即可使用,这也就是所谓的“高度可重用”,“快速集成”以及“易部署和升级”,他们依赖的就是比较好的逻辑和物理封装,还有可设置的加载路径
面向服务的体系结构:SOA,也是OSGi.NET中一个重要功能,主要是为了各个模块可以以一种统一和通用的方式进行交互。以下是官方文档描述:
这里的“服务绑定模型”,像是一个服务总线,用来存储和检索各种服务。而SOA就是将应用程序的不同功能单元通过定义良好的接口和契约联系起来,称为服务,它具有中立的接口定义,没有强制绑定到特定的实现上,松耦合。
硬件中的系统总线:
在OSGI.NET,它与硬件系统总线相似,差不多是同样一个目的,但更侧重于接口和具体实现的物理隔离,即所谓的“按需所用”,结合后面将提到的“即插即用”,将会使整个软件具有更好的灵活性和配置性,以适应未来各种不同的“改变”,无论外部或者内部。
OSGi.NET的“服务总线”功能是以服务的形式发布的,有两种注册服务方式:
服务注册完成后,可通过GetService来获取一个指定接口类型的此接口实现的所有实例或者通过GetFirstOrDefaultService来获取一个指定接口类型的此接口实现的第一个或默认实例。这两个方法可以通过激活器里的IBundleContext还有运行时环境BundleRuntime得到。
OSGI.NET 的服务总线可以用 IoC 容器来实现,基效果可能 会更好,OSGI.NET目前只提供一个较轻量级的解决方案,并没有引入 IoC 容器。
以下是服务总线关键部分的实现代码:
OSGI.NET 支持更高级的模块扩展策略,具体含义如下(官方文档):
OSGi.NET的扩展点和扩展都是定义在相应模块的Mainfest.xml文件中的,非常容易维护和更改。模块与模块之间就可以完成“扩展点和扩展”,当然主程序中启动的运行时环境也能直接处理指定“扩展点”的“扩展”。
扩展点的定义,用 <ExtensinPoint> 节点来配置;
<?xml version="1.0" encoding="utf-8"?> <Bundle xmlns="urn:uiosp-bundle-manifest-2.0" SymbolicName="WorkspaceShell" InitializedState="Active"> <Activator Type="WorkspaceShell.Activator" Policy="Immediate" /> <Runtime> <Assembly Path="WorkspaceShell.dll" Share="false" /> </Runtime> <ExtensionPoint Point="ToolBar"/> <ExtensionPoint Point="MainMenu"/> <ExtensionPoint Point="Navigation"/> </Bundle>
对扩展点进行扩展,用 <Extension>节点来进行配置:
OSGI.NET 支持热插拔与动态支持,具体内容如下()官方文档):
OSGI.NET 部署的相关内容:
OSGi.NET对模块的处理并不是安装和卸载这么简单,它的生命周期如下:
这里“停止(Stopping)”和“卸载(Uninstalled)”需要稍加说明一下,停止是模块将自己的生命进程交还给运行时环境前最后的一个状态,而卸载是运行时环境将模块结束前的最后一个状态。简单的说,
安装、解析、卸载只能由运行时环境来管理,而启动、激活、停止是模块本身可一同参与的;停止的模块依然在运行时环境管理中,只不过模块不能再管理自己的状态,但其他模块可通过运行时环境对它进行控制;卸载的模块,在下次重启并删除之前,依然在运行时环境管理中;安装和启动,类似卸载和启动;解析和具体的模块加载过程,可参照前文“模块化和插件化”实例部分。
插件运行的完整过程(动态性)
1.1 当然你可以通过编码的方式将它启动起来,例如
2. “晚激活,即当Bundle的类被加载是再激活”。这个有点儿类似.NET的晚激活策略,当存在“激活器”时,也就说如果勾选,则模块会从安装到解析便停止执行,而当别的模块需要引用它的某个类时会自动继续执行启动和激活,理论上可以减少不必要的消耗
2. 运行起整个主程序,默认的APE选项将不会出现。接着我们打开“远程管理工具”,输入字母l,这时也没有OSGi.NET.APEDecoderPlugin。保留着主程序不要关闭它。
3. 在远程管理工具里输入i "OSGi.NET.APEDecoderPlugin" "D:\OSGi.NET.APEDecoderPlugin.zip" "D:\cnblogs.com\OSGi.NET\Demo4\OSGi.NET.AudioPlayerShell\OSGi.NET.AudioPlayerShell\bin\plugins\FormatTypes\Lossless\OSGi.NET.APEDecoderPlugin",并回车,可以看到提示已经安装成功
4. 激活,OSGi.NET.APEDecoderPlugin处于安装(installed),而非激活(Active),还需要启动它,继续输入s 6
动态信息注入,优点:
模块扩展移除时如何将他的注入信息也一同移除?完整代码:
11.1 OSGI.NET 的环境支持(官网文档):
OSGi.NET是基于.NET框架且与语言以及类型无关,也就是说.NET能支持什么环境,OSGi.NET也就能支持什么环境,他能适应各种.NET生产和装配环境。
11.2 OSGI.NET 的设计原则与最佳实践
UIOSP 官网:http://www.iopenworks.com/
OSGI.NET 官网:http://osgi.codeplex.com/
参考资料:http://www.cnblogs.com/zhaojudi/archive/2013/02/26/2933788.html
http://www.cnblogs.com/shalahu/archive/2013/02/21/2921306.html
示例源码: http://osgi.codeplex.com/SourceControl/latest
标签:
原文地址:http://www.cnblogs.com/wisdo/p/5539136.html