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
?
轉載于:https://www.cnblogs.com/attilax/p/4738207.html
總結
以上是生活随笔為你收集整理的Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac 开启hidpi_开启hidpi的
- 下一篇: 2015-10-21 C#1