OSGI.NET 学习笔记--架构篇

 关于osgi.net ,想必大家也听说过,以下是自己在学习osgi.net 过程中整理出来的内容,供大家学习参与使用。

  1.  UIOSP 开放工厂框架架构

  开放工厂所有插件基于OSGi.NET面向服务插件框架构建。该框架是国际上第一个完整迁移了OSGi R4规范的OSGi.NET框架,提供了动态模块化、面向服务和模块扩展三大功能,支持WinForm桌面应用、WPF桌面应用、ASP.NET Web应用、ASP.NET MVC应用、Silverlight RIA应用、手机应用等任意.NET应用环境

       

1.1  开放工厂架构

        

  开放工厂由OSGi.NET插件框架和插件仓库组成

  •   OSGi.NET插件框架:它是OSGi R4规范移植到.NET平台的实现,提供了动态模块化、面向服务架构和模块扩展三大功能。在这里,模块具备物理隔离性、热插拔、动态性和物理重用性。
  • 插件仓库:它是一个在线的插件仓库,所有插件均符合OSGi.NET规范,可运行在OSGi.NET插件框架之上。您可以从插件仓库中任意挑选插件进行组装,也可以开发新的插件进行功能扩展。

  1.2  开放工厂具有六方面的价值

      

  2.  插件框架原理

    2.1 插件和插件运行时

    在OSGi.NET插件框架中,插件即Bundle,它具备物理隔离、热插拔和动态特性。每一个插件都是完全可复用的,可以被动态的安装、启动、停止、卸载或更新。插件运行时即BundleRuntime,则是插件的运行容器,它负责从插件目录中加载和启动插件。

  2.2   面向服务

  在OSGi.NET插件框架中,插件具备高内聚、低耦合特性,也就是说插件间耦合度非常低。服务即Service,是插件通讯的方式。在这里,“服务=接口 + 实现”。接口是服务的契约(即接口),服务提供商实现了服务的接口并将服务注册到服务总线,服务消费者则通过服务契约从服务总线搜索服务并绑定使用。这里,服务是动态,可以被动态注册、卸载和更新,一个服务契约也可能有多个服务实现。

  2.3   插件扩展

   在OSGi.NET插件框架,插件具备可扩展性,可以在不变更插件代码情况下,更改或者扩展插件的行为。这个扩展机制是通过一对基于XML格式的“扩展点 + 扩展”来实现的。一个插件可以通过定义“扩展点”来实现可扩展,而其它插件则通过定义对应的“扩展”来注册/更新功能。扩展/扩展点在插件启动时注册到插件运行时,相反,在卸载时,则从插件运行时卸载。

  2.4  片段插件

   在OSGi.NET,有一种特殊的插件,称为片段插件,即Fragment Bundle。片段插件相当于子插件,其作用是为了扩充其它插件的类型空间、扩展信息。除了片段插件的插件,都是宿主插件(Host Bundle)。与宿主插件不同的是,片段插件不能被启动、停止,没有类加载器,不允许从片段插件加载类型。当宿主插件被启动后,片段插件会自动附加到宿主插件,即将片段插件的类型空间、扩展信息合并到宿主插件。

3.   开放工厂原理

3.1  开放工厂原理概述

  插件生命周期顺序:

    7(更新升级内核)->5,6(被启动的插件调用插件管理服务来更新升级插件)->1(获取页面流服务,入口点插件,进入主界面) -> 4,6(插件中心插件调用插件管理服务,更新升级插件)->2,3(远程控制)

    当插件程序运行后,它首先调用iOpenWorks启动程序来检测OSGi.NET插件框架等内核文件版本并下载更新,接着启动插件运行时, 从Plugins目录中加载并启动插件。在这里,iOpenWorks启动程序将调用开放工厂平台的插件仓库OpenAPI检查是否有新版本的内核并从 仓库中下载最新版本的文件(如原理图的箭头7所示)。

在启动插件过程中,如果应用程序下载安装了自动更新插件,该插件会调用插件管理服务来检查插件仓库更新情况,并自动下载最新版本 的更新包,等重新启动应用程序时,执行自动更新。在这里,插件管理服务将调用开放工厂平台的插件仓库OpenAPI来获取插件仓库的新插件 和新版本的插件并利用OpenAPI进行下载安装或升级插件(如原理图的箭头5、6所示)。

    插件运行时启动完成后,主程序从运行时获取页面流服务,获取入口点并运行入口插件的程序,进入主界面或者插件中心插件(如原理图的箭头1所示)。

插件中心插件也将调用插件管理服务,获取开放工厂插件仓库的新插件和插件的最新版本,当点击下载插件时,利用插件管理服务从插件仓库 下载安装或升级插件(如原理图的箭头4、6所示)。

    此外,当插件运行时启动完成后,远程管理服务插件利用WebService服务包装器将OSGi.NET内核管理功能暴露成Web服务,这样OSGi.NET 插件SDK的远程管理控制台运行起来后,便可以调用该Web服务实现内核插件、服务浏览以及插件启动、停止、卸载和安装操作,方便插件程序的 调试(如原理图的箭头2、3所示)。

iOpenWorks开放工厂平台主要由插件仓库和插件仓库OpenAPI组成。插件仓库实现插件的版本管理、OSGi.NET内核文件版本管理、SDK及客户端 管理,而插件仓库OpenAPI则向外暴露了插件及其版本信息、内核文件及其版本信息从而为客户端提供内核及插件的自动升级支持。

    OSGi.NET插件SDK由开发者安装,向开发者提供了OSGi.NET插件框架、OSGi.NET Web扩展、iOpenWorks启动程序这三个开发程序集,此外,还提供了插件项目模板、 远程管理控制台(用于调试用,可以查看OSGi.NET内核情况)、文档、示例。开发者使用OSGi.NET插件SDK的项目模板来创建WinForm或者Web插件 应用程序时,这个模板默认实现了:

  • 调用iOpenWorks启动程序程序集来检查内核文件版本并执行更新;
  • 创建插件运行时BundleRuntime 并运行,从而启动插件内核,默认从Plugins目录加载插件;
  • 高级模板默认包含了页面流服务插件、应用中心插件、插件管理服务插件、 远程管理服务插件、WebService包装器服务插件(插件自动升级插件没有在模板中包含,可以从插件仓库中下载)。

  4.   插件相关内容

   4.1  插件

    在OSGi.NET插件框架中,插件是一个具备物理隔离性、完全重用的功能模块。在这里“插件=Manifest.xml + 类 + 资源”,Manifest.xml是插件的描述文件,位于插件目录的根目录下;类即插件的类型空间,由插件自身的程序集和依赖的插件/依赖的程序集组成,资源类似与类,由插件本身的资源和依赖的资源组成。

    4.2  插件目录

    插件由Manifest.xml插件清单文件、程序集、资源组成,程序集和资源位于插件根目录或者子目录下。其标准目录结构如下。

    4.3  插件类加载

    在OSGi.NET插件框架中,插件拥有独立的目录结构,具备物理隔离性。相应地,每一个插件有独立的类型空间,这个类型空间由插件程序集、插件依赖的程序集、片段插件程序集和片段插件依赖的程序集组成。插件的类型是由插件类加载器来加载的。

  当你在插件中使用一个类型创建一个对象时,比如MyClassInBundle myClass = new MyClassInBundle(),插件类加载器会按照上面的顺序搜索需要加载的MyClassInBundle类型。与此同时,你也可以通过调用插件对象的LoadClass方法(IBundle.LoadClass)从插件类型空间中动态加载一个类型

    4.4  插件生命周期

    在OSGi.NET插件框架中,插件具有生命周期。插件生命周期状态有:Installed、Resolved、Active、Uninstalled四个可见状态和Starting、Stopping两个临时状态。其中,Installed表示插件已经安装;Resolved表示插件依赖的程序集或者依赖的插件已经满足,这个插件可以被正常启动;Active则表示插件已经被成功启动;Uninstalled表示插件已经被卸载。Starting是一个过渡状态,当启动插件时,如果插件使用了晚激活策略,则插件在注册扩展信息、服务信息之后,直接返回,不会执行激活器的Start方法,这个方法会推迟到第一次从这个插件加载类型时调用并进入Active状态;反之,如果没有使用晚激活策略,插件会调用激活器Start方法并进入Active状态。在启动过程,如果出现异常,则插件会自动转回Resolved状态。Stopping是另一个临时状态,在停止插件时,首先进入该状态,然后调用激活器的Stop方法后进入Resolved状态。

    4.5  插件运行时和插件启动过程

    插件框架启动时,首先从插件目录中发现并加载所有的插件;然后,对插件进行依赖解析,判断插件依赖的程序集和依赖的插件是否满足;接着,按照启动级别顺序启动所需的插件;一旦插件启动完成,则插件框架便完成启动。

在插件启动过程中,将按照创建插件上下文、注册扩展点/扩展信息、注册服务信息、创建插件激活器并调用Start方法的顺序完成一个插件的启动过程。如果插件实现的晚激活,则推迟最后一步的执行,直到第一次从插件加载类型;如果插件没有定义激活器,则忽略最后一步。

  5.   插件相关对象

  5.1 插件运行时BundleRuntime

    插件运行时BundleRuntime代表插件框架内核对象,它是所有插件的运行容器。 在示例中,控制台主程序在Program的Main函数中,通过创建BundleRuntime对象并调用其 Start方法来启动插件框架内核。当Start方法调用完成后,BundleRuntime对象将从插件目 录中加载插件并启动插件。

    5.2 插件

    插件也称为Bundle,从OSGi.NET规范上讲,“插件=Manifest.xml + 类 + 资源”。其中, Manifest.xml即插件清单文件,用于描述插件的基本信息、类型信息和扩展信息; 插件具备隔离的类型空间,由插件本身的程序集和依赖的插件的程序集组成; 插件拥有自己的资源,存放在私有的文件夹。

在定义一个插件时,您只需要关注三个非常重要的接口,分别是:插件激活器IBundleActivator、 插件IBundle和插件上下文IBundleContext。其中,插件激活器由开发人员自己定义;而插件IBundle和插件上下文IBundleContext则由插件内核创建, 你可以在插件激活器获取中获取到这两个对象

    5.3  插件清单Mainfest.xml

    插件清单文件(Manifest.xml)位于模块标准目录结构的根目录之下,它定义了模块的基本信息、模块激活信息、模块类加载相关的运行时信息、服务定义信息、模块扩展定义信息以及模块详细信息。

  以上清单文件定义了该模块的一个本地程序集“bin\ShellPlugin.dll”,该程序集位置相对于模块的根目录,当然,你也可以指定一个绝对目录。模块还定义了一个激活器和扩展点。

    5.3  IBundleActivator

    IBundleActivator表示插件激活器,是插件的入口和出口,用于在插件启动或停止时执行相关操作。

插件激活器通过Manifest.xml的Activator节点配置,当插件被启动时插件激活器的Start方法被调用, 当停止时Stop方法被调用。

在插件激活器的Start/Stop方法的context参数,即插件上下文IBundleContext对象,通过IBundleContext 您还可以获取对应的插件IBundle实例。

    5.4 IBundle

  IBundle表示由内核创建的一个插件,一般而言,“Bundle=Manifest.xml + 类 + 资源”。 插件对象向您暴露了以下功能:

  • 类型加载。
  • 资源加载。
  • 插件生命周期操作。

   5.5  IBundleContext

  IBundleContext表示插件上下文,实现了对插件框架的反射,通过模块激活器IBundleActivator的 Start/Stop方法的参数获取该对象。 插件上下文向您暴露了以下功能:

  • 获取对应的插件实例。
  • 对插件执行生命周期操作,安装其它插件。
  • 插件仓库查询。
  • 服务注册与绑定。
  • 获取本插件的扩展点和扩展。
  • 监听框架事件、服务事件、插件事件和扩展事件。

  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

时间: 2024-10-08 13:21:31

OSGI.NET 学习笔记--架构篇的相关文章

OSGI.NET 学习笔记--应用篇

关于osgi.net ,想必大家也听说过,以下是自己在学习osgi.net 过程中整理出来的内容,供大家学习参与使用. 1.  OSGI.NET 与UIOSP OSGi是Open Service Gateway Initiative的缩写,Wiki对其的定义为:一方面它指OSGi Alliance组织,它是由IBM.Oracle.BEA.SAP等国际IT巨头组成的OSGi联盟组:另一方面指该组织制定的一个基于Java语言的服务规范——OSGi服务平台(Service Platform).OSGi

SystemTap 学习笔记 - 安装篇

https://segmentfault.com/a/1190000000671438 在安装前,需要知道下自己的系统环境,我的环境如下: uname -r 2.6.18-308.el5 Linux 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux 安装 为了部署 SystemTap,需要安装以下两个 RPM 包: systemtap systemtap-runtime 以 root

Vue学习笔记入门篇——组件的使用

本文为转载,原文:Vue学习笔记入门篇--组件的使用 组件定义 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 组件使用 注册 注册一个全局组件,你可以使用 Vue.component(tagName, options).组件在注册之后,便可以在父实例的模块中以自定义元素 的形式使用.

Vue学习笔记入门篇——组件的内容分发(slot)

本文为转载,原文:Vue学习笔记入门篇--组件的内容分发(slot) 介绍 为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 "transclusion" 如果你熟悉 Angular).Vue.js 实现了一个内容分发 API,使用特殊的 'slot' 元素作为原始内容的插槽. 编译作用域 在深入内容分发 API 之前,我们先明确内容在哪个作用域里编译.假定模板为: <child-component> {{ messa

Vue学习笔记入门篇——组件的通讯

本文为转载,原文:Vue学习笔记入门篇--组件的通讯 组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B.它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件.然而,在一个良好定义的接口中尽可能将父子组件解耦是很重要的.这保证了每个组件可以在相对隔离的环境中书写和理解,也大幅提高了组件的可维护性和可重用性.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props 向下传递

Vue学习笔记进阶篇——Render函数

本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接近编译器. <h1> <a name="hello-world" href="#hello-world"> Hello world! </a> </h1>

渗透学习笔记--基础篇--sql注入(字符型)

环境:dvwa1.7数据库:mysql前置知识:sql语句(Click me)      在进行sql注入前,我们先熟悉熟悉select语句.一.打开我们的sql终端 二.进入之后可以看到有mysql>我们输入sql语句,即可返回我们想要的结果,注意分号哟!我们使用的dvwa,在我们前几章设置的时候,会在数据库中生成一个dvwa的database:这里我们使用它来进行我们的select 语句:(1)使用dvwa数据库use dvwa;(2)在users表里查询用户名为'admin'的所有信息se

iOS开发学习笔记:基础篇

iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境),Xcode是一个集成开发环境,包括了编辑器.调试.模拟器等等一系列方便开发和部署的工具,iOS SDK则是开发应用所必需,不同的SDK分别对应不同的iOS版本或设备,通常我们需要下载多个iOS SDK以确保我们开发的程序能够在不同版本的iOS上正常运行. 创建新工程 Xcode提供了很多种工程模

Python学习笔记基础篇——总览

Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列表.字典.主文件判断.对象 Python学习笔记——基础篇1[第三周]——set集合 Python学习笔记——基础篇2[第三周]——计数器.有序字典.元组.单(双)向队列.深浅拷贝.函数.装饰器 Python学习笔记——基础篇[第四周]——迭代器&生成器.装饰器.递归.算法.正则表达式 Python