Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结

1. 微内核与插件的优点1

2. 插件的注册与使用2

2.1. Ioc容器中注册插件2

2.2. 启动器微内核启动3

3. 插件的俩种执行策略3

3.1. 必须手动接续,否则自动终止(推荐)3

3.2. 必须手动throw  stop ex终止,负责自动接续。。4

4. 插件链的生成原理4

5. -------code4

6. 参考7

1. 微内核与插件的优点

但凡有生命力的产品,都是在扩展性方面设计的比较好的,因为没有哪个产品可以覆盖所有需求,对于开源软件尤其如此。所以,产品只有具有良好的扩展性,允许用户或第三方参与进来,进行二次开发,才能保持生命力。

怎么样的扩展性才是最好的?通常来讲,就是没有任何功能是硬编码的,所有的功能都可被用户替换。

原作者应把自己也当作扩展者,自己添加功能时,也要用第三方扩展者同样的方式进行,而不要有特权。

要做到这一点,就需要一个良好的框架支撑,“微内核+插件”是一个不错的选择,Eclipse、Maven等知名软件都采用该体系。

什么是“微内核+插件”?微内核,即最小化核心,内核只负责插件的组装,不带任何功能逻辑,所有功能都由可替换的插件实现,并且,组装过程应基于统一的规则,比如基于setter注入,而不能对不同插件硬编码组装,这样可以确保没有任何功能在内核中硬编码。比如:Spring, OSGI, JMX, ServiceLoader等都是常见的微核容器,它们负责基于统一规则的组装,但不带功能逻辑。

非功能性的插件组装过程,可以由微内核框架来完成,那功能性的组装怎么办呢?我们可以把功能性的组装过程也封装成插件,即让大插件组装小插件,形成级联组装关系。

2. 插件的注册与使用

2.1. Ioc容器中注册插件

FilterFilterChain plugx = new FilterFilterChain();

plugx.add_action("ini", new G().m1);

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

2.2. 启动器微内核启动

public partial class App : Application

{

//    this.StartupEventArgs

public App()

{

IocX.ini();

FilterFilterChain plugx = new FilterFilterChain();

plugx.do_action("ini",null,null);

Console.WriteLine("---f");

}

}

}

3. 插件的俩种执行策略

3.1. 必须手动接续,否则自动终止(推荐)

Java的就是这个。

这个比较好,可以支持ajax。。。。

可以漏斗形闪入闪出调用。。折回调用。。

//for ajax ,must trans in param

do_action("submit_before_check",mp,submitx2);

3.2. 必须手动throw  stop ex终止,负责自动接续。。

在以下情况下web container不能把filter加载到service中:

· 

· 抛出ServletException异常。

· 在container定义的时间内没有返回。

4. 插件链的生成原理

遍历委托方法List,生成LIST

遍历List,设置nextChain为下一个。。

启动插件流程。。

FilterFilterChain   firstChain = chains[0];

filterHandler hd = firstChain.handler;

hd(args,firstChain.nextChain);

5. -------code

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace ClassLibrary1.com.attilax.lang

{

public class FilterFilterChain

{

public static Dictionary<String, IList<filterHandler>> pluginsAti = new Dictionary<string, IList<filterHandler>>();

public delegate Object filterHandler(Object obj, FilterFilterChain nextChain);//第一步:定义委托类型

filterHandler handler; //filter

//   private FilterFilterChain next1;

//  private filterHandler filterHandler;

public FilterFilterChain()

{

}

public void add_action(String hookPoint, filterHandler func)

{

try

{

pluginsAti[hookPoint].Add(func);

}

catch (KeyNotFoundException e)

{

pluginsAti.Add(hookPoint, new List<filterHandler>());

pluginsAti[hookPoint].Add(func);

}

//     pluginsAti.hookPoint.push(func);

}

public void do_action(String hookPoint, object args, filterHandler fltFinishCallback)

{

IList<filterHandler> fun_arr = pluginsAti[hookPoint];

//===============add to list

IList<FilterFilterChain> chains = new List<FilterFilterChain>();

for (var i = 0; i < fun_arr.Count; i++)

{

FilterFilterChain cur = new FilterFilterChain();

cur.handler = fun_arr[i];

chains.Add(cur);

}

if (fltFinishCallback != null)

{

FilterFilterChain next2 = new FilterFilterChain();

next2.handler = fltFinishCallback;

chains.Add(next2);

}

///set next

for (var i = 0; i < chains.Count; i++)

{

try

{

chains[i].nextChain = chains[i + 1];

}

catch (ArgumentOutOfRangeException e) { }

}

chains[chains.Count - 1].nextChain = new FilterFilterChain();

//  fn(mp);

FilterFilterChain   firstChain = chains[0];

filterHandler hd = firstChain.handler;

hd(args,firstChain.nextChain);

}

public void doFilter(Object data)

{

filterHandler hd = this.handler;

if(hd!=null)

hd(data, this.nextChain);

}

public FilterFilterChain nextChain { get; set; }

}

}

6. 参考

Atitit.wordpress插件机制原理与设计 attilax 总结

Atitit.java filter插件机制原理与 attilax总结.doc

Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结的更多相关文章

  1. atitit.session的原理以及设计 java php实现的异同

    atitit.session的原理以及设计 java php实现的异同 1. session的保存:java在内存中,php脚本因为不能常驻内存,所以在文件中 1 2. php的session机制 1 ...

  2. Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结

    Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结 1. 普通代理1 1.1.1. 普通代理2 2. 隧道代理3 3. 反向代理 4 4. 正向代理也可以使用apache实现 ...

  3. Atitit.导出excel报表的设计与实现java .net php 总

    Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...

  4. Atitit.导出excel报表的设计与实现java .net php 总结

    Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...

  5. mybatis插件机制原理

    mybatis插件机制及分页插件原理 参考链接:mybatis插件机制及分页插件原理 如何编写一个自定义mybatis插件 参考链接:mybatis 自定义插件的使用

  6. PHP中的插件机制原理和实例

    PHP项目中很多用到插件的地方,更尤其是基础程序写成之后很多功能由第三方完善开发的时候,更能用到插件机制,现在说一下插件的实现.特点是无论你是否激活,都不影响主程序的运行,即使是删除也不会影响. 从一 ...

  7. Maven生命周期和插件机制

    Maven中的一个非常重要的概念是生命周期和插件,这篇文章重点介绍下Maven的生命周期. Maven的生命周期是抽象的,具体的功能是有具体的插件来完成的,Maven有相当多的功能插件,以至于Mave ...

  8. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

  9. Java:HashMap原理与设计缘由

    前言 Java中使用最多的数据结构基本就是ArrayList和HashMap,HashMap的原理也常常出现在各种面试题中,本文就HashMap的设计与设计缘由作出一一讲解,并解答面试常见的一些问题. ...

随机推荐

  1. SQL Server--CheckPoint

    http://www.cnblogs.com/TeyGao/category/526201.html

  2. winform 中设置窗体的默认焦点

    转载:http://www.cnblogs.com/weekzero/p/3504513.html winform的窗体中,有时候需要设置默认焦点,有时候需要取消默认焦点. 设置默认焦点,最简单的方法 ...

  3. 版本控制SVN的使用笔记

    安装 客户端和服务端下载地址,打开网址,根据自己的操作系统下载对应的版本,window用户服务端一般安装的是VisualSVN,客户端安装TortoiseSVN,在实际工作中,我们一般只需要安装Tor ...

  4. minishift的本地代码构建

    看文档说支持,但实际尝试了下,失败 发现仍然是找github中的代码 找了半天,发现是在目录下有.git的隐含目录,然后copy到其他目录下删除,然后再试,发现仍然失败. 日志看是指定的目录并没有传入 ...

  5. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  6. go语言基础之开发工具

    一.安装go 1.在linux环境下安装go yum install go -y 2.go下载地址 https://golang.org/dl/ 3.windows安装版本 go1.9.2.windo ...

  7. ckeditor 绑定事件

    CKEDITOR.instances["Content"].on("instanceReady", function () { //set keyup even ...

  8. Lidgren.Network – an introduction to networking in C# games

    Lidgren.Network – an introduction to networking in C# games http://genericgamedev.com/tutorials/lidg ...

  9. Linux内核project导论——linux学习和职业曲线(刚開始学习的人,中级,高级都可參考)

    Linux世界介绍 给自己定级 门外汉: 不会安装操作系统 不会用虚拟机(安装和使用) 入门级: 熟悉常见的发行版,甚至装过而且能用一些特殊发行版(比如kali)做过一些简单的图形界面的使用. 会一些 ...

  10. 【Spark】RDD操作具体解释2——值型Transformation算子

    处理数据类型为Value型的Transformation算子能够依据RDD变换算子的输入分区与输出分区关系分为下面几种类型: 1)输入分区与输出分区一对一型 2)输入分区与输出分区多对一型 3)输入分 ...