zoukankan      html  css  js  c++  java
  • 基于.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对象来启动、停用、卸载插件。

    今天就简单介绍到这里,后续的文章会越来越细。

      

     

  • 相关阅读:
    React路由基本的使用(一)
    Codeforces Round #627 (Div. 3) C
    Codeforces Round #627 (Div. 3) B
    Codeforces Round #627 (Div. 3) A
    hdu2049 不容易系列之(4)——考新郎(组合,错排)
    Codeforces Round #626 (Div. 2) E. Instant Noodles(二分图,最大公因数)
    Codeforces Round #626 (Div. 2) D. Present(位运算)
    逆元的计算方法
    Educational Codeforces Round 83 D. Count the Arrays(组合,逆元,快速幂)
    hdu4460 Friend Chains(记忆化广度优先搜索)
  • 原文地址:https://www.cnblogs.com/gengzhe/p/4395716.html
Copyright © 2011-2022 走看看