基于.NET MVC的高性能IOC插件化架构(二)之插件加载原理
上一篇博文简单介绍了下插件化的代码组成部分:http://www.cnblogs.com/gengzhe/p/4390932.html,源码地址:https://github.com/luohuazhiyu/sunmvc
这篇博客主要讲解下插件化实现的原理,先面先讲解几个概念:
一、契约
插件与系统必须有契约,系统才能发现插件并正确加载插件,我采用的是所有插件都实现Sun.Core里面的IPlugin接口。
二、自述
插件在被加载的时候,需要告诉系统,我是什么类型的插件,我的guid,我依赖的程序集,我的状态与权限,我的配置信息等等,这个行为是插件的自我描述,简称自述。
三、配置
插件必须能够进行配置(一般在安装的时候或者才系统启动之前进行配置),插件配置的使用过程大致为:系统发现插件-》加载插件-》加载插件配置文件-》把配置信息传入插件内实现了IPlugin接口的类对插件进行初始化。
---------------------------------------------------------------------------------------
插件使用流程:插件开发(也可通过插件仓库下载需要的插件)-》插件zip文件上传-》配置插件-》启用插件
有了流程,我顺着流程一步一步分析实现原理:
一、插件开发
1.所开发的插件必须有一个类实现Sun.Core里面的接口,这个接口里面包含初始化、启动、停止、卸载几个方法,因为只有插件自己才了解自己,所以这些功能需要插件自己提供,系统只负责使用。
2.插件必须提供PluginConfig.Json文件,这里面的配置文件有固定的格式,用于向系统提供配置信息及保存用户的设置。
二、插件上传
step1:插件压缩为zip文件,上传保存到PluginZips文件夹下面。
step2:自动解压缩插件文件到PluginTemp(插件检测临时目录)。
step3:检测插件是否包含IPlugin的实现以及是否包含PluginConfig.Json文件,如果存在继续往下执行,如果不存在则删除临时文件以及zip文件,并反馈插件错误信息。
step4:通过插件配置文件,拷贝到Plugins(插件存放目录)下的相应插件类别目录下面。
.....(加载插件)
三、插件加载
1、系统启动加载
step1:遍历Plugins目录下面的所有插件文件,读取PluginConfig对象列表并把列表信息保存到插件管理器里面以便管理调用。
step2:筛选掉PluginConfig里面状态标识为error的插件。
step3:把插件程序集及依赖的不存在系统bin目录下的程序集加载到App_Data目录下的Plugins目录下(便于统一加载及不影响到原Plugins目录下插件的修改、删除)。
step4:加载Plugin程序集及依赖程序集(如果使用IOC,需要把程序集注册到IOC容器)。
step5:调用程序集下IPlugin的实现类,执行初始化,如果插件状态为启动,可直接启动插件。
2、上传插件加载(单个)
上传插件的加载与启动加载的不同之处在于前者不需要遍历,其它步骤一样。
备注:如果使用IOC容器,那么这里需要把新增的这些程序集注册到IOC容器并重置容器。
四、插件管理
因为在插件加载的过程中,插件的配置信息及IPlugin对象都已保存,这里就比较简单。通过列表可以筛选启动、停用、异常的插件,并可以直接调用IPlugin对象来启动、停用、卸载插件。
今天就简单介绍到这里,后续的文章会越来越细。
基于.NET MVC的高性能IOC插件化架构(二)之插件加载原理的更多相关文章
- 基于.NET MVC的高性能IOC插件化架构
基于.NET MVC的高性能IOC插件化架构 最近闲下来,整理了下最近写的代码,先写写架构,后面再分享几个我自己写的插件 最近经过反复对比,IOC框架选择了Autofac,原因很简单,性能出众,这篇博 ...
- 基于.NET MVC的高性能IOC插件化架构(一)
最近闲下来,整理了下最近写的代码,先写写架构,后面再分享几个我自己写的插件 最近经过反复对比,IOC框架选择了Autofac,原因很简单,性能出众,这篇博文是我的各大IOC框架的性能测试:http:/ ...
- ASP.NET MVC 4 插件化架构简单实现-思路篇
用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC 4 来实现每个插件都可以完全从主站点剥离出来,即使只是一个插 ...
- MVC 4 插件化架构简单实现
转ASP.NET MVC 4 插件化架构简单实现-思路篇 用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC ...
- ASP.NET MVC 4 插件化架构简单实现-实例篇
先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...
- MVC 4 插件化架构简单实现实例篇
ASP.NET MVC 4 插件化架构简单实现-实例篇 先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集 ...
- 安卓架构 视频 Android 插件化架构设计
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha Android 插件化架构设计-Dream老师 自定义SDK =====
- Android插件化(二):使用DexClassLoader动态载入assets中的apk
Android插件化(二):使用DexClassLoader动态载入assets中的apk 简单介绍 上一篇博客讲到.我们能够使用MultiDex.java载入离线的apk文件.须要注意的是,apk中 ...
- Android插件化(三):OpenAtlas的插件重建以及使用时安装
Android插件化(三):OpenAtlas的插件重建以及使用时安装 转 https://www.300168.com/yidong/show-2778.html 核心提示:在上一篇博客 An ...
随机推荐
- (转载)python多行注释
(转载)http://www.cnblogs.com/pylemon/archive/2011/05/23/2054090.html python本身不带多行注释,编辑时每行敲一个“#”相当的不方便, ...
- oracle触发器使用总结
1.说明 1)触发器是一种特殊的存储过程,触发器一般由事件触发并且不能接受参数,存储器由语句块去调用 2)触发器分类: 1.DML触发器: 创建在表上,由DML事件引发 2.instead of触发器 ...
- UVALive 4957 Fake scoreboard
题意就是有n个队伍和m个题目 给出了每个队伍解决的题目数量 每个题目也给出了被解决的次数 然后求一个方阵. N,Y表示每个队伍是否过了哪个题目. 要求字典序最小. 这题给人的第一反应就是网络流. 虽然 ...
- ubunu设置java命令为全局的命令-添加到全局环境变量
sudo vim /etc/environment 在environment中后边添加代码: JAVA_HOME=/usr/local/jdk1.6.0_31 CLASSPATH=/usr/local ...
- Git Push 不用再次输入用户名和密码方法
前言 在大家使用github的过程中,一定会碰到这样一种情况,就是每次要push 和pull时总是要输入github的账号和密码,这样不仅浪费了大量的时间且降低了工作效率.在此背景下,本文在网上找了两 ...
- java环境下的数据库读写分离
方案很多:阿里的中间件cobar.aop注解方式.com.mysql.jdbc.ReplicationDriver读写分离驱动MySQL数据库的同步. MySQL是开源的关系型数据库系统.主从同步复制 ...
- poj 3271 Lilypad Pond bfs
因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步). 然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数 ...
- ShareSDK 社会化分享 集成步骤
第一步 :获取ShareSDK 官网:http://www.mob.com 完整的集成文档:http://wiki.mob.com/android-sharesdk%E5%AE%8C%E6%95%B4 ...
- if..endif 语法
使用 if(); elseif(); else; endif; 这一系列复杂的语句无助于 PHP 3.0 解析器的效率.因此,语法改变为: Example#1 移植:旧有 if..endif 语法 i ...
- php锁表
用PHP实现mysql锁表 mysql锁表,是利用相关的SQL语句 //执行SQL语句 锁掉userinfo表 $sql = "LOCK TABLES userinfo WRITE" ...