多模块后带来的问题解决方法 - OSGI原形(.NET)
目前只做了基础的功能,比如:
- 各个模块单独的AppDomain容器
- Activator激活
- 导出的服务检查
不过,虽说这样,但目前的这个版本已经能实现模块分离、互相依赖调用等功能了,对模块划分已经有很好的作用了。
先来说下基本结构:

目前这个框架对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隔离的,性能上肯定下降。
代码下载
多模块后带来的问题解决方法 - OSGI原形(.NET)的更多相关文章
- 多模块分布式系统的简单服务访问 - OSGI原形(.NET)
多模块分布式系统的简单服务访问 - OSGI原形(.NET) 先描述一下本篇描述的适用场景(3台server, 各个模块分布在各个Server上,分布式模块互相依赖.交互的场景): 多个OSIG引擎交 ...
- [eclipse]改项目名称后tomcat连接问题解决方法
背景:在我们使用eclipse进行项目开发时,有时候会需要修改项目名称,当改动项目名称后发现tomcat启动访问出现问题,使用新的项目名称不可行,使用旧的项目名称却可以.修改web.xml里面的dis ...
- VMware安装Elementary OS 后不能上网问题解决方法
具体情况:之前在学校是通过有线网上网,VMware中的系统打开就可以直接连上网,现在回家图方便是通过无线路由器上网,发现虚拟机系统上不来网. 解决方法:控制面板->网络和Internet-> ...
- krpano下全屏后弹窗失效问题解决方法
原因 krpano 自身的全屏仅全屏自身,以外的html效果将无法显示 解决方法 把全屏按钮换成浏览器自身的全屏效果 解决步骤 vtourskin.xml <layer name="n ...
- 解决在安装Fiddler4.6版本后,在手机上安装证书出现的问题解决方法
解决在安装Fiddler4.6版本后,在手机上安装证书出现的问题解决方法 设置fiddler抓手机包后,在手机上访问http://ip:port,出现如下问题: 问题:creation of the ...
- 老出BUG怎么办?游戏服务器常见问题解决方法分享
在游戏开发中,我们经常会遇到一些技术难题,而其引发的bug则会影响整个游戏的品质.女性向手游<食物语>就曾遇到过一些开发上的难题,腾讯游戏学院专家团Wade.Zc.Jovi等专家为其提供了 ...
- Python爬虫编程常见问题解决方法
Python爬虫编程常见问题解决方法: 1.通用的解决方案: [按住Ctrl键不送松],同时用鼠标点击[方法名],查看文档 2.TypeError: POST data should be bytes ...
- win7中VS2010中安装CSS3.0问题解决方法
win7中VS2010中安装CSS3.0问题解决方法 在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网 ...
- WingIDE中文乱码问题解决方法
WingIDE中文乱码问题解决方法 安装完WingIDE后,首次运行python脚本时,若脚本中含有UTF-8中文,在Debug I/O输出框中,全部变成了乱码. 这时其实我们设置下WingIDE的编 ...
随机推荐
- socket通讯,TCP,UDP,HTTP的区别
socket编程有TCP和UDP, TCP:传送控制协议(Transmission Control Protocol) 传输控制协议TCP是TCP/IP协议栈中的传输层协议,它通过序列确认以及包重发机 ...
- go 开发中需要注意的与python的不同点
从python转golang开发已经3个月了,因为写过c++,所以对golang接受的还算快,这段经历也不是很痛苦.伯乐在线上看了一些大神关于python转golang过程中的不适应和吐槽,决定写下篇 ...
- Java-- String源码分析
版权声明:本文为博主原创文章,未经博主允许不得转载 本篇博文基于java8,主要探讨java中的String源码. 首先,将一个类分为几个部分,分别是类定义(继承,实现接口等),全局变量,方法,内部类 ...
- 关于PID的如何修改的FAQ
1.如何查询支付宝账号对应的PID: 2.意外绑错或者想修改PID流程: (1)和业务联系拿到商家平台支付宝变更协议书填写(模版如下,可在附件中下载) 致:杭州银盒宝成科技有限公司 本人因 ...
- 用户 'XXX\SERVERNAME$' 登录失败。 原因: 找不到与提供的名称匹配的登录名。 [客户端: ]
一工厂的中控服务器遇到了下面Alert提示,'XXX\SERVERNAME$' XXX表示对应的域名, SERVERNAME$(脱敏处理,SERVERNAME为具体的服务器名称+$),而且如下所示, ...
- [20190324]奇怪的GV$FILESPACE_USAGE视图.txt
[20190324]奇怪的GV$FILESPACE_USAGE视图.txt--//发现GV$FILESPACE_USAGE定义很奇怪,做一个记录.1.环境:SCOTT@book> @ ver1P ...
- c/c++ 线性表之顺序表
线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...
- Spring Cloud Config 配置属性覆盖优先级。
/** * Flag to indicate that the external properties should override system properties. * Default tru ...
- Python: 遍历
======================遍历列表========================# 直接遍历list: for elem in list: pass # 通过索引获取 for i ...
- jdk旧版本下载
如何找到旧版本的jdk: 1.去oracle官网关于下载jdk的这一板块,https://www.oracle.com/technetwork/java/javase/downloads/index. ...