OSGI原形(.NET)

目前只做了基础的功能,比如:

  1. 各个模块单独的AppDomain容器
  2. Activator激活
  3. 导出的服务检查

不过,虽说这样,但目前的这个版本已经能实现模块分离、互相依赖调用等功能了,对模块划分已经有很好的作用了。

先来说下基本结构:

目前这个框架对UI的模块化尚不支持,只支持单机下的模块加载(以后会改进)。

特点:

  • Runtime、Module1、Module2、Module3都是在各自的AppDomain下运行的,不会互相干扰
  • 由于采用了隔离AppDomain的方式加载Module,所以能实现轻松卸载AppDomain、某dll、dll版本切换之类的任务,对后续扩展提供了方便

来看看模块的编写

OrderModule库是主要的业务逻辑以及模块定义的地方

OrderModule.PublicInterfaces是公用定义,比如接口、事件、dto等,考虑到方便分发,因此独立了出来(如果不介意这点,也可以合并成一个库)

模块定义文件:

<?xml version="1.0" encoding="utf-8" ?>
<Module>
<Name>Order Module</Name>
<Version>1</Version>
<Assembly>OrderModule</Assembly>
<Activator>OrderModule.Activator</Activator> //这个是OSGI调用的第一个classType, 会执行里面的2个方法:Start和Stop
<RequiredService>LoggingModule.PublicInterfaces.ILog</RequiredService>//此模块需要依赖哪些其他Service,可以有多个
<ProvidedService>OrderModule.PublicInterfaces.IOrderProcessor</ProvidedService>//此模块会提供的服务,可以有多个
</Module>

Activator:

class Activator:OSGIFramework.BundleActivator
{
public override void Startup(BundleContext bc)
{
Console.WriteLine("OrderModule Startup"); BundleContext.Current.RegisterProvidedService<IOrderProcessor, OrderProcessorImpl>();
//注册服务
} public override void Stop(BundleContext bc)
{
Console.WriteLine("OrderModule Stop"); BundleContext.Current.UnRegisterProvidedService<IOrderProcessor, OrderProcessorImpl>();
//卸载服务
}
}

服务的实现:

class OrderProcessorImpl : ServiceProvider, IOrderProcessor //ServiceProvider是基类,由于需要在AppDomain之间穿梭,因此必须继承这个
{
public Guid PlaceOrder(OrderModule.PublicInterfaces.Dtos.OrderDto order)
{
BundleContext ctx=BundleContext.Current; //获得上下文 ILog log = ctx.GetProvidedService<ILog>(); //获得一个服务
log.Log("log something..."); Console.WriteLine("PlaceOrder body"); return Guid.NewGuid();
}
}

模块化,还要考虑散落在不同目录的dll文件和xml定义文件。在Console程序中,也可以通过xml定义格式来做:

<?xml version="1.0" encoding="utf-8" ?>
<Manifests>
<Manifest>D:\documents\visual studio 2010\Projects\OSGIDemo\LoggingModule\bin\Debug\Manifest.xml</Manifest>
<Manifest>D:\documents\visual studio 2010\Projects\OSGIDemo\OrderModule\bin\Debug\Manifest.xml</Manifest>
<Manifest>D:\documents\visual studio 2010\Projects\OSGIDemo\OrderPDFProcessor\bin\Debug\Manifest.xml</Manifest>
</Manifests>

主程序:

static void Main(string[] args)
{
BundleRuntime runtime = new BundleRuntime();
runtime.Start(); BundleContext ctx = BundleContext.Current; IOrderProcessor processor = (IOrderProcessor)ctx.GetProvidedService(typeof(IOrderProcessor).FullName); OrderDto order = new OrderDto();
Guid id=processor.PlaceOrder(order);
Console.WriteLine("id="+id.ToString()); Console.ReadKey();
runtime.Stop();
runtime.Dispose();
runtime = null;
}

就可以运行了,效果图:

当然,由于是AppDomain隔离的,性能上肯定下降。

代码下载

自省推动进步,视野决定未来。
心怀远大理想。
为了家庭幸福而努力。
A2D科技,服务社会。
A2D Framework(Alpha)

  • 1. Cache System(本地缓存与分布式缓存共存、支持Memcache和Redis、支持贴标签形式(类似Spring 3.x的Cache形式))
  • 2. Event System(本地事件与分布式事件分发)
  • 3. IoC(自动匹配功能,实例数量限制功能)
  • 4. Sql Dispatcher System(基于Sql server的读写分离系统)
  • 5. Session System(分布式Session系统)
  • 6. 分布式Command Bus(MSMQ实现,解决4M限制,支持Session的读取)
  • 7. 规则引擎
 

OSGI原形(.NET)的更多相关文章

  1. 多模块分布式系统的简单服务访问 - OSGI原形(.NET)

    多模块分布式系统的简单服务访问 - OSGI原形(.NET) 先描述一下本篇描述的适用场景(3台server, 各个模块分布在各个Server上,分布式模块互相依赖.交互的场景): 多个OSIG引擎交 ...

  2. 多模块后带来的问题解决方法 - OSGI原形(.NET)

    目前只做了基础的功能,比如: 各个模块单独的AppDomain容器 Activator激活 导出的服务检查 不过,虽说这样,但目前的这个版本已经能实现模块分离.互相依赖调用等功能了,对模块划分已经有很 ...

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

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

  4. 分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

    在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群.这个分布式服务集群是基于DynamicProxy.WCF和OSGi.NET插件框架实现的.我将从设计思路.目标和实现三方面来描述. ...

  5. OSGi 基本原理

    定义 OSGi(Open Service Gateway Initiative)技术是面向Java的动态模型系统. 这个框架实现了一个优雅.完整和动态地组价模型.应用程序(称为bundle)无序重新引 ...

  6. 重新诠释的OSGi规范

    上周五部门开会讨论新一代产品(基于.net Winform)的设计规范,从设计规范慢慢讨论到体系结构等架构存在的问题,诸如菜单.工具条.状态条.界面布局等不能实现配置化和自动化,子系统之间拥有强依赖, ...

  7. Liferay7 BPM门户开发之38: OSGi模块化Bndtools、Maven、Gradle开发构建入门

    前言 OSGi是目前动态模块系统的事实上的工业标准,它适用于任何需要模块化.面向服务.面向组件的应用程序.Eclipse如此庞大和复杂的插件体系,就是基于OSGi.Liferay也是基于OSGi.OS ...

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

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

  9. 原创:Equinox OSGi应用嵌入Jersey框架搭建REST服务

    一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Equinox OSGi应用嵌入Jersey框架搭建REST服务 1.新建插件工程HelloWebOSGI a. ...

随机推荐

  1. 由于问题引起信号ORA-27154无法启动数据库

    测试库运行startup当系统提示(11.2.0.1): 查询ORA-27154的错误: Error: ORA-27154 Text: post/wait create failed -------- ...

  2. JVMTI 中间JNI系列功能,线程安全和故障排除技巧

    JVMTI 中间JNI系列功能,线程安全和故障排除技巧 jni functions 在使用 JVMTI 的过程中,有一大系列的函数是在 JVMTI 的文档中 没有提及的,但在实际使用却是很实用的. 这 ...

  3. C---通过指针访问数组

    C语言规定:如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下一个元素. 引入指针变量后,就可以用俩种方法来访问数组元素了. 如果p的初值为&a[0],则: P+i 和a+i 就 ...

  4. A generic error occurred in GDI+. 上传图片报错

    代码就不说了,因为本地测试 ok, 服务端 就不行 ,服务器 环境 阿里云 win2008 r2  64 位 原因 是我没有这是 文件加权限 : 左边 的 少了 权限~ 代码 :含义是 网络图片 裁剪 ...

  5. jquery自己主动旋转的登录界面的背景代码登录页背景图

    在其他网站上看到比较爽Web登录界面.背景图片可以自己主动旋转. 介绍给大家.有兴趣的可以改改下来作为自己的系统登录界面. 如图: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  6. JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内

    /* *JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内 *@param date1 date2(形如:'2015-01-01'类 ...

  7. UiAutomator源码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源码分析之启动和运行>我们描述了uitautomator从命令行运行到加载测试用例运行测试的整个流程,过程中我们也描述了UiAutomatorBridge ...

  8. tomcat源代码Catalina

    Catalina的作用是初始化各个组件,并開始启动各个组件. 上文中介绍了Bootstrap是怎样启动Catalina的,如今来看看Catalina的作用: 1,Catalina通过Digester类 ...

  9. OCP-1Z0-051-题目解析-第11题

    11. View the Exhibit and examine the structure of the PRODUCTS table.All products have a list price. ...

  10. SQL SERVER2005 excel float导入

    接到mission:将一堆excel的东西导入到SQL SERVER2005 命令很easy SELECT * INTO XLImport3 FROM OPENDATASOURCE('Microsof ...