上一篇博文简单介绍了下插件化的代码组成部分: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插件化架构(二)之插件加载原理的更多相关文章

  1. 基于.NET MVC的高性能IOC插件化架构

    基于.NET MVC的高性能IOC插件化架构 最近闲下来,整理了下最近写的代码,先写写架构,后面再分享几个我自己写的插件 最近经过反复对比,IOC框架选择了Autofac,原因很简单,性能出众,这篇博 ...

  2. 基于.NET MVC的高性能IOC插件化架构(一)

    最近闲下来,整理了下最近写的代码,先写写架构,后面再分享几个我自己写的插件 最近经过反复对比,IOC框架选择了Autofac,原因很简单,性能出众,这篇博文是我的各大IOC框架的性能测试:http:/ ...

  3. ASP.NET MVC 4 插件化架构简单实现-思路篇

    用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC 4 来实现每个插件都可以完全从主站点剥离出来,即使只是一个插 ...

  4. MVC 4 插件化架构简单实现

    转ASP.NET MVC 4 插件化架构简单实现-思路篇   用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC ...

  5. ASP.NET MVC 4 插件化架构简单实现-实例篇

    先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...

  6. MVC 4 插件化架构简单实现实例篇

    ASP.NET MVC 4 插件化架构简单实现-实例篇   先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集 ...

  7. 安卓架构 视频 Android 插件化架构设计

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha Android 插件化架构设计-Dream老师 自定义SDK =====

  8. Android插件化(二):使用DexClassLoader动态载入assets中的apk

    Android插件化(二):使用DexClassLoader动态载入assets中的apk 简单介绍 上一篇博客讲到.我们能够使用MultiDex.java载入离线的apk文件.须要注意的是,apk中 ...

  9. Android插件化(三):OpenAtlas的插件重建以及使用时安装

    Android插件化(三):OpenAtlas的插件重建以及使用时安装 转 https://www.300168.com/yidong/show-2778.html    核心提示:在上一篇博客 An ...

随机推荐

  1. HDU 2389 Rain on your Parade

    大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再 time 时间内移动到不同的雨伞处(不允许两个人共用一把伞).   输入数据: 第一行是一个T代表T组测试数据 ...

  2. topcoder13185 TreePuzzle

    https://community.topcoder.com/stat?c=problem_statement&pm=13185 被wck屠了. 考试时候想分类讨论,结果发现情况有点复杂,最后 ...

  3. CSU 1111 有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园。A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕。C 太太因为正身怀六甲无法加入她们的行动,所以就打算出90元钱

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82974#problem/D 解题思路:本题的意思就是三位均出90,然后AB按做 ...

  4. The ToolStripMenuItem visible value always false

    http://social.msdn.microsoft.com/Forums/vstudio/en-US/8cf60e57-6d97-43c6-bb3a-394b9bf130af/the-tools ...

  5. C#实现数据结构——线性表(上)

    什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...

  6. [Javascript] Advanced Reduce: Additional Reducer Arguments

    Sometimes we need to turn arrays into new values in ways that can't be done purely by passing an acc ...

  7. java的Comparator和Comparable

    java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.      ...

  8. Android应用程序之间共享文字和图片(一)

    以下为TestReceiveShare1工程 MainActivity如下: package cn.testreceiveshare1; import java.util.ArrayList; imp ...

  9. CentOS 6.6下PXE+Kickstart无人值守安装操作系统

    一.简介 1.1 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持 ...

  10. mysql怎么限制某些查询语句的执行?

    mysql怎么限制某些查询语句的执行? 比如某些sql语句执行时间很长,超过10s,怎么样超过10s就不让其执行? 后续更新中...