上周五部门开会讨论新一代产品(基于.net Winform)的设计规范,从设计规范慢慢讨论到体系结构等架构存在的问题,诸如菜单、工具条、状态条、界面布局等不能实现配置化和自动化,子系统之间拥有强依赖,甚至产生强依赖等等,最后我提出通过OSGi 框架来解决界面和模块之间的问题,并立下军令状一周内把核心框架Beta搭建完毕,第二周进行一次培训。

基于项目的特点,结合贞宝兄的OSGi.Net 和Mono.Addins 进行了重新诠释,在两天半的时间里通过Mono.Addins  和NLite 的依赖注入容器相结合实现了诠释后的OSGi规范,再这里首先感谢贞宝兄在OSGi规范的布道和推广工作,其次要感谢Mono.Addins 强大的扩展功能 ,起到了事半功倍的效果,如果没有它的存在我就不敢夸海口了,呵呵。在用Mono.Addins 框架来实现OSGi 规范时也遇到一些问题,发现Mono.Addins 的扩展过于强依赖,不能获取插件扩展的原始元数据再这一点贞宝兄的OSGi.net 实现的就好多了,完全开放给使用者。有时间了自行实现一个,这是后话,其实在09年已经开发了Mbs 框架,里面其实包含了OSGI 的很多东东,但是不标准。

下面是诠释后的OSGi 规范(备注该规范仅仅使用在公司项目中)概要介绍,里面有很多值得商榷的地方,欢迎指正。

1          插件(Bundle)

插件是一个提供特定功能的独立的子系统。

插件是独立的可部署单元

插件可以向其它插件提供扩展点,其它插件可以扩展该插件

插件不可以向其它插件提供服务。

插件提供的功能通过其类型空间来体现。

插件是由addin.xml清单文件、本地程序集(*)、资源和其它文件组成

插件具备独立性、 隔离性和完全可复用的特性,并具有独立的类型空间。

2          插件运行时(BundleRuntime)

插件运行时是所有插件的运行容器。

BundleRuntime是一个单件的实例,当创建后,您可以通过BundleRuntime.Instance来获取这个实例。 主程序必须提供创建并启动插件运行时的功能

3          插件扩展机制

插件可以在启动时动态的实现对其它插件的扩展并且暴露出扩展点供其它插件来扩展,当插件停止时,这种扩展会动态的卸载。

插件间的扩展没有任何的耦合,即这种扩展机制可以确保插件间没有任何的依赖,达到绝对的复用。

插件的扩展机制是通过清单文件的ExtensionPoint节点和Extension节点来定义的。插件通过ExtensionPoint 节点向其它插件暴露扩展点。这个节点包含一个Path属性,即扩展点的标识。 插件通过Extension节点定义一个其它插件扩展点的扩展,它通过Path属性来指定对应的扩展点,并利用该节点下定义子节点,这些子节点就是一个扩展的详细信息。

插件的扩展机制常常用在菜单、工具条、状态条、UI界面的动态组合上,当然也可以用在其它场景中。

4          服务管理机制

服务由服务契约和具体实现组成。

服务是指轻量级服务,

服务契约是暴露方法的接口,

服务实现则是实现指定接口的类型。

服务引入,使得我们可将接口与实现分离,并在需要的时候选择特定的实现。

服务的生命周期拥有两种类型:单利、瞬时,默认注册在服务容器中的服务是瞬时的

服务只能驻留在服务容器-IBundleContext.Container中

插件具有独立的服务容器,因此插件内的所有服务之间是可以通信的,但是插件间的服务是不能够直接通信的,除了根插件之外

面向服务的编程模型:“注册-发现-绑定-卸载”,通过服务容器-IBundleContext.Container对象来进行的中相关的方法来使用的

服务具有动态性,一般情况下,它在插件启动时注册到平台,在插件停止时从平台中卸载

5          插件依赖机制

一个进程只有一个根插件,所有的其它插件都依赖根插件,其它插件可以共享根插件中资源、类型空间、服务

一个插件可以依赖多个其它插件(根插件除外),其它插件只能依赖该插件的扩展点、资源、类型空间,不能依赖服务

6          插件间的通信

任何插件都可以和根插件通过服务进行通信,反之根插件和其它任何插件都不能通过服务进行通信

插件间不能直接通过服务进行通信

插件间可以通过轻量级的消息总线通信(进程内消息总线)

插件间可以通过重量级的消息总系通信(Socket)

插件间可以通过重量级分布式服务进行通信(Remoting、WebService、WCF、REST)

插件间可以通过轻量级REST服务(进程内)进行通信

谢谢大家的阅读,麻烦大伙点一下推荐,再次谢谢大家。 ^_^

重新诠释的OSGi规范的更多相关文章

  1. OSGi规范的C#实现开源

    这是大约在3-4年前完成的一个C#实现的OSGi框架,实现的过程参照了OSGi规范与与一些实现思路(感谢当时的那些资料与项目),此框架虽然仅在几个小型项目有过实际的应用,但OSGi的规范实现还是相对比 ...

  2. OSGi规范概要

    目前最新的OSGi规范是2012年7月发布的Release 5,Version5.0(后文简称为R5.0)版本,该规范定义了Java模块化系统所涉及的各种场景(开发.打包.部署.更新和交互等),以及其 ...

  3. OSGi——面向服务架构规范简述

    OSGi——面向服务架构规范简述 去年我们组要开发一个新的产品,在讨论产品架构路线的时候,美国的架构师向大家征集了架构设计思想(我推荐了SCSF),有一位工程师向他推荐了OSGi.以前我还没有听过OS ...

  4. Java模块化规范之争(转载)

    经过近20年的发展,Java语言已成为今日世界上最成功.使用的开发者人数最多的语言之一,Java世界中无数商业的或开源的组织.技术和产品共同构成了一个无比庞大的生态系统. 与大多数开发人员的普遍认知不 ...

  5. 开源协议:LGPL协议、OSGi协议---打酱油的日子

    本文介绍开源的协议. LGPL 是 GNU Lesser General Public License (GNU 宽通用公共许可证)的缩写形式,旧称 GNU Library General Publi ...

  6. osgi笔记

    Bundle-Classpath可以实现内嵌jar. 一个Bundle的Activator不需要进行Export 一个Package中的类被两个ClassLoader加载,包中的Private cla ...

  7. OSGi 的核心配置、动态化及问题

    一.OSGi的核心组件Bundle,与java中jar包的差别就是元数据配置:      常用的Bundle元数据定义:     a) Bundle-Activator:定义Activator的实现全 ...

  8. OSGi 的由来和本质特性

    OSGi 的由来 随着科技和需求的发展和变化,现在的软件变得越来越庞大.这样,随之而来的最大挑战就是软件在设计上的越来越复杂和维护上的越来越困难.为了解决这个问题,软件架构师将软件切分成比较小的并且易 ...

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

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

随机推荐

  1. H3 BPM:为石化企业提供一个不一样的全停大修平台

    H3 BPM大型炼化企业装置全停检修管理平台(简称"全停大修")结合国际化的流程管理理念.成熟的系统技术架构.优秀的行业解决方案,为石油化工行业全停大修提供了卓越的信息化管理方案, ...

  2. Android中开发工具Android Studio修改created用户(windows环境)

    最近经常有朋友反馈说我的安卓项目中,在一些类中会出现Created by panchengjia on 2016/12/30的字样,是如何自动实现的(默认一般为Administrator),如下图: ...

  3. HTML5 程序设计 - 使用HTML5 Canvas API

    请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...

  4. linux下使用shell 自动执行脚本文件

    以下实例本人在Centos6.5 64位操作系统中使用 一.定时复制文件 a.在/usr/local/wfjb_web_back目录下创建 tomcatBack.sh文件 文件内容: #将tomcat ...

  5. PHP安装

    工具 http://www.cnblogs.com/xiwang6428/p/4315049.html http://www.iteye.com/news/22672 1 安装:sudo apt-ge ...

  6. .NET中使用Redis (二)

    很久以前写了一篇文章 .NET中使用Redis 介绍了如何安装Redis服务端,以及如何在.NET中调用Redis读取数据.本文简单介绍如何设计NoSQL数据库,以及如何使用Redis来存储对象. 和 ...

  7. 关于python中的flush问题

    今天写了一个控制台下的进度条小程序,遇到了关于flush的问题,在这里小小的总结一下. 首先在要flush的字符串必须后边加上'\r'(回车) 将数据送入缓冲区这样在新打印字符的时候就可以将原来的显示 ...

  8. 【PRINCE2是什么】PRINCE2认证之七大主题(1)

    进入第一个主题,PRINCE2商业论证:PRINCE2指出,商业论证就是进行判断是否值得对项目进行投资,值不值的问题.PRINCE2的商业论证有四个 在项目开始时,开发商业论证.在整个项目生命周期中, ...

  9. iOS-----正则表达式的基础语法

    正则表达式简单语法总结 一.什么是正则表达式 从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式.那么一个正 ...

  10. 关于安卓6.0权限申请 PermissionDog

    最近在一家公司实习,项目中需要用到适配安卓6.0以上的系统,我本来是想用其他人已经写好的权限申请框架来实现的,但是发现跟我的需求有点小区别,所以就自己写了一个 这个权限申请的帮助类很小,只有一个jav ...