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. node webkit (nw.js) 无法调试的结局方案之一

    之前做过nw项目,当时主要内容是由别人做的!过后回到家中,自己研究了下这方面.结果发现我自己写的nw 客户端不可以调试!在网上各种找办法,没找到,深感绝望,突然看到 (https://github.c ...

  2. Json.net说法——(一)修饰标签,日期序列化

    摘自: http://www.cnblogs.com/jams742003/archive/2009/12/24/1631587.html 通过属性标签自定义JSON序列化 JsonObjectAtt ...

  3. Python自然语言处理资料库

    1.LTP [1]- 语言技术平台(LTP) 提供包括中文分词.词性标注.命名实体识别.依存句法分析.语义角色标注等丰富. 高效.精准的自然语言处理技术.经过哈工大社会计算与信息检索研究中心 11 年 ...

  4. Python和Flask真强大:不能错过的15篇技术热文(转载)

    Python和Flask真强大:不能错过的15篇技术热文 本文精选了 Python开发者 11月份的15篇 Python 热文.其中有基础知识,机器学习,爬虫项目实战等. 注:以下文章,点击标题即可阅 ...

  5. Razor语法(一)

    语法名称    Razor 语法 Web Forms 等效语法 代码块 @{ int x = 123; string y ="because."; } <% int x = ...

  6. centos查看哪些包提供指定头文件

    [问题]:项目迁移时,原来在suse上正常的代码在centos上报错: g++ -g -Wall -fPIC -I../include -I./ -I../src -I/share/comm_ext ...

  7. HDU 3726 Graph and Queries treap树

    题目来源:HDU 3726 Graph and Queries 题意:见白书 思路:刚学treap 參考白皮书 #include <cstdio> #include <cstring ...

  8. java中Runtime类

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.      一般不能实例化一个Runtime对象, ...

  9. tornado ThreadPoolExecutor

    import os import sys import time import tornado.httpserver import tornado.ioloop import tornado.opti ...

  10. 初识 Swift编程语言(中文版)

    前言 今天Apple公布了新的编程语言Swift.也提供了一本将近400页的 The Swift Programming Language(Swift编程语言). 尽管我没有开发人员账号.没法实际上机 ...