zoukankan      html  css  js  c++  java
  • Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结

    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-------code 4

    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://blog.csdn.net/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<StringIList<filterHandler>> pluginsAti = new Dictionary<stringIList<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 { getset; }

     

     

     

           

        }

    }

     

     

     

    6. 参考

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

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

     

  • 相关阅读:
    C语言使用指针表示数组的注意事项
    LUNA16数据集的百度云链接
    c语言定义指针类型需注意事项
    对DeepLung数据预处理部分的详细展示
    python统计字符串中字符个数
    C语言预处理命令之文件包含
    C语言值拷贝传递机制
    【论文】CornerNet:几点疑问
    解读 pytorch对resnet的官方实现
    python 对三维CT数据缩放
  • 原文地址:https://www.cnblogs.com/attilax/p/15198871.html
Copyright © 2011-2022 走看看