分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

osgi.net从入门到精通系列之四

发布时间:2023-09-06 02:21责任编辑:彭小芳关键词:暂无标签

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

清单文件示例

以下是一个清单文件的示例。这个清单文件的命名空间是“urn:uiosp-bundle-manifest-2.0” ,它定义了一个唯一名称为ShellPlugin,名称也为ShellPlugin的模块。这个模块的版本是 1.0.0.0,当UIOSP框架被启动时,这个模块会被加载并自动激活。此外,这个模块启动级别 为2,即它在级别为1的所有模块后面被启动。

CopyXML
<?xml version="1.0" encoding="utf-8"?><Bundle xmlns="urn:uiosp-bundle-manifest-2.0" SymbolicName="ShellPlugin" Version="1.0.0.0" Name="ShellPlugin" ??InitializedState="Active" StartLevel="2"> ?<Activator Type="ShellPlugin.Activator" Policy="Immediate" /> ?<Runtime> ???<Assembly Path="bin\ShellPlugin.dll" Share="false" /> ?</Runtime> ?<ExtensionPoint Point="ShellPlugin.MenuStrip" /></Bundle>

此外,以上清单文件定义了该模块的一个本地程序集“bin\ShellPlugin.dll”,该 程序集位置相对于模块的根目录,当然,你也可以指定一个绝对目录。模块还定义了一个 激活器和扩展点。关于这些定义,我们在以下将详细介绍。

清单文件结构

清单文件是一个标准格式的XML文件,该文件的XML节点和属性命名规则采用C#的Property 方式命名,即每一个单词的头一个字母大写,单词间没有分隔符。

Bundle节点

Bundle是整个清单文件的根节点。该节点用于定义模块的特征名称(唯一标识)、 名称、版本号、模块在平台启动后的初始状态、启动级别、宿主模块标识、宿主模块版本 和命名空间属性。模块的特征名称是必须填写的属性,命名空间用于在编写XML文件时获得 智能提示。该节点的结构如图4-3所示。

图4-3 Manifest.xml文件Bundle节点定义

Bundle节点的属性的详细描述如下:

  1. xmlns:定义了清单文件的名字空间,其值固定为"urn:uiosp-bundle-manifest-2.0"。
  2. SymbolicName:插件的唯一名称,必填属性。
  3. Version:插件的版本,比如1.2.0.3,默认为1.0.0.0,可选属性。
  4. Name:插件的名称,可选属性。
  5. InitializedState:平台加载插件后,插件处于的默认状态,其默认值为Active,可选属性。
  6. StartLevel:插件的启动级别,启动级别越小优先级越高,越先被启动,普通插件的启动级别一般大于等于2,可选属性。
  7. HostBundleSymbolicName:插件的宿主唯一名称,一旦声明了该属性,则当前插件便是一个片段插件。片段插件不能被当成宿主插件来使用,它仅是作为宿主的一部分而存在,在宿主解析时,会自动将片段插件的定义附加到宿主。 因此片段插件不能定义StartLevel、InitializedState和Activator,且不能从片段加载类或者资源。如果需要加载,必须通过其宿主来实现。
  8. HostBundleVersion:宿主插件版本约束,可以不填写(版本无关)、固定的版本(1.0.0.0)或者某一范围版本([1.0, 2.0))。

Bundle节点还包含:至多一个Activator节点、一个Runtime节点、至多一个Services节点 、若干ExtensionPoint节点、若干Extension节点和至多一个BundleInfo节点。

Activator节点

该节点定义一个模块启动和停止的入口。Activator节点的XML结构如图4-4所示。

图4-4 Manifest.xml文件Activator节点定义

该节点由Type和Policy属性组成。它们的描述如下:

  1. Type:插件激活器类型全名称,比如ConsolePlugin1.Activator,该类型必须实现IBundleActivator接口,必填属性。
  2. Policy:激活策略,Immediate或者Lazy,分别为立即激活或者晚激活。立即激活是指一旦插件执行启动,激活器的Start(IBundleContext context)会被调用并进入Active状态;而晚激活则是一旦插件执行启动,只是将状态变为Starting,而激活器的Start(IBundleContext context)方法会推迟到直到从该插件加载一个类型时才调用,从而进入Active状态。该属性为可选属性。

Runtime节点

该节点定义了模块的类型空间。模块类型空间是指模块可访问的类型的集合,它 决定了一个模块向外提供的功能。UIOSP平台中,每一个模块都具有其独立的类型空间和 类加载器,类加载器用于从其类型空间中加载类型。模块类型空间由本地程序集和依赖 的其它模块的程序集构成。Runtime节点的XML结构如图4-5所示。

图4-5 Manifest.xml文件Runtime节点定义

该节点由Assembly和Dependency节点组成,分别表示模块本地程序集和依赖程序集。 它们的描述如下。

Assembly节点

Assembly节点用于定义模块一个本地程序集,本地程序集分为私有程序集和 共享程序集,后者表示该程序集的类型可以被其它模块共享使用。私有程序集的 Share属性为false,相反,共享程序集为true。该节点由Path和Share属性构成, 它们的描述如下:

  1. Path:程序集的路径,可以是相对于插件根目录的路径,也可以是绝对路径,必选属性。
  2. Share:程序集是否可以被其它插件共享,默认为false,可选属性。

Dependency节点

Dependency节点用于模块一个程序集依赖声明,它表示该插件引用了另一个 插件在Assemly定义的Share为true的程序集。该节点由BundleSymbolicName、BundleVersion、 AssemblyName、AssemblyVersion和Resolution属性组成,其描述如下:

  1. BundleSymbolicName:依赖程序集所在的插件唯一名称。
  2. BundleVersion:依赖程序集所在的插件的版本约束,可以不填写(版本无关)、固定的版本(1.0.0.0)或者某一范围版本([1.0, 2.0)),可选属性。
  3. AssemblyName:程序集名称,可选属性,如果没有指明依赖的程序集名称,则意味着依赖指定插件所有程序集。
  4. AssemblyVersion:程序集版本,可以不填写(版本无关)、固定的版本(1.0.0.0)或者某一范围版本([1.0, 2.0)),可选属性。
  5. Resolution:依赖解析方式,Mandatory或者Optional,分别表示依赖必须强制解析成功这个插件才能够被启动、依赖可以解析失败。

Services节点

Services节点用于声明一个模块向外暴露的服务,这些服务在模块启动时自动注册到UIOSP 平台,并在模块停止时从平台卸载。模块可以通过两种方式向平台注册服务,一种方法是通过激活器 的Start方法中的IBundleContent类型参数的AddService来注册,另一种方法是通过Manifest.xml 的文件Services节点来注册服务。Services节点的结构如图4-6所示。

图4-6 Manifest.xml文件Services节点定义

Services节点由若干个Service节点组成,Service节点用于表示一个具体的服务, 该节点由Interface和Type属性组成,它们的描述如下:

  1. Interface:服务的接口全名称,即该服务的契约,使用“,”分割多个接口,如ConsolePlugin1.IMyService1,ConsolePlugin1.IMyService2。
  2. Type:服务的实现类型全名称,如ConsolePlugin1.MyService。

ExtensionPoint节点

该节点用于定义一个模块向其它模块暴露的扩展功能,这样其它模块可以通过定义 Extension节点来注入相应的扩展功能实现。UIOSP通过ExtensionPoint和Extension这一对 XML配置节点来实现模块的扩展。一般而言,插件扩展需要通过2个步骤实现:(1)在 Manifest.xml定义一个扩展点;(2)在插件通过IBundleContext.ExtensionChanged 事件和IBundleContext.GetExtensions获取其它插件对其扩展并进行处理。该平台 所有的扩展信息都具备动态性,即当模块被启动时扩展点和扩展会注册到平台,相反,当 模块被卸载时,它们会被卸载掉。该节点的结构如图4-7所示。

图4-7 Manifest.xml文件ExtensionPoint节点定义

该节点由Point和Schema属性组成,它们的描述如下:

  1. Point:扩展点名称。
  2. Schema:扩展信息的XML定义需要遵守的架构。

Extension节点

该节点用于定义一个模块对另一个模块的扩展。其结构如图4-8所示

图4-8 Manifest.xml文件Extension节点定义

该通过Point属性指定其对应的扩展点的名称,它包含的所有子节点就是注册到 扩展点的内容的信息,子节点必须通过扩展点定义的Schema的验证。以下是Extension 定义的示例。该示例定义的扩展其对应的扩展点是UIShell.SiteMap。当该模块启动时, 它会把Extension包含的信息注册到平台,暴露出UIShell.SiteMap扩展点的模块可以 通过模块上下文获取这个定义,然后在导航栏上创建相应的节点。

CopyXML
<Extension Point="UIShell.SiteMap"> ?<siteMapNode path="/" title="Home" description="Home"> ???<siteMapNode title="Home" description="Home" url="~/default.aspx"/> ???<siteMapNode title="Introduction" url="~/Plugins/ReportPlugin/default.aspx"/> ???<siteMapNode title="Report Demo" url="~/Plugins/ReportPlugin/test.aspx"/> ?</siteMapNode> ?<siteMapNode path="/Products" title="Products" description="Our products" ???url="~/Products.aspx"> ???<siteMapNode title="Hardware" description="Hardware choices" ???????url="~/Hardware.aspx" /> ???<siteMapNode title="Software" description="Software choices" ???????url="~/Software.aspx" /> ?</siteMapNode></Extension>

BundleInfo节点

该节点用于定义模块的详细信息,为可选节点,其结构如图4-9所示。

图4-9 Manifest.xml文件BundleInfo节点定义

该节点包含的属性的详细描述如下:

  1. ManifestVersion:清单版本,为2。
  2. DocumentLocation:文档位置。
  3. UpdateLocation:插件更新时下载新插件的地址。
  4. Category:类别。
  5. Description:详细描述。
  6. Author:作者。
  7. ContactAddress:联系方式称。
  8. Copyright:版权声明。

Manifest.xml完整架构图

清单文件的XML完整架构如图4-10所示。

图4-10 Manifest.xml文件XML架构

osgi.net从入门到精通系列之四

原文地址:https://www.cnblogs.com/iwanwu/p/9926166.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved