你的位置:首页 > ASP.net教程

[ASP.net教程]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. -------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