码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2018-11-07 23:09:24      阅读:812      评论:0      收藏:0      [点我收藏+]

标签:category   median   注册服务   report   coding   http   实现   eve   contact   

模块清单文件(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从入门到精通系列之四

标签:category   median   注册服务   report   coding   http   实现   eve   contact   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!