国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

基于.net 職責鏈來實現 插件模式

2019-11-17 01:59:16
字體:
來源:轉載
供稿:網友
基于.net 職責鏈來實現 插件模式
    •   插件式的例子
  1. QQ電腦管家,有很多工具列表,點一下工具下載后就可以開始使用了
  2. eclipse,X Server等等
    •   插件式的好處
  1. 插件降低框架的復雜性,把擴展功能從框架中剝離出來
  2. 讓第三方有機會來擴展程序的功能
    •   思路

公開一個插件接口,如果.DLL或.EXE的代碼中有繼承這個接口就將其示為插件,并將這些插件放在同一目錄。運行程序的時候掃描目 錄并通過反射判斷.DLL或.EXE中是否存在該接口,若存在,則當作插件加載進來。如下圖示

  • 基于.net職責鏈來實現插件模式

1.定義命令接口

     public interface ICommand    {        ServerReturn execute();        ServerReturn Rollback();    }

獲取當前目錄下繼承該接口的方法

        public  List<ICommand> CommandList()        {            List<ICommand> ICommandList = new List<ICommand>();            string[] files = Directory.GetFiles(System.IO.Directory.GetCurrentDirectory());            int i = 0;            foreach (string file in files)            {                string ext = file.Substring(file.LastIndexOf("."));                if (ext != ".dll") continue;                try                {                    // 加載插件                    Assembly tmp = Assembly.LoadFile(file);                    Type[] types = tmp.GetTypes();                    bool ok = false;                    foreach (Type t in types)                        if (IsValidCommand(t))                        {                            // 通過反射實例化                            ICommand plugin = (ICommand)tmp.CreateInstance(t.FullName);                            ICommandList.Add(plugin);                            ok = true;                            if (ok) break;                        }                }                catch (Exception err)                {                    throw err;                }            }            return ICommandList;        }        /// <summary>        /// 判斷DLL中是否繼承了ICommand接口        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        PRivate static bool IsValidCommand(Type t)        {            bool ret = false;            Type[] interfaces = t.GetInterfaces();            foreach (Type theInterface in interfaces)            {                if (theInterface.FullName == "ClassDemo.ICommand")                {                    ret = true;                    break;                }            }            return ret;        }

職責鏈執行方法組

        /// <summary>        /// 方法執行        /// </summary>        public void exec()        {            List<ICommand> list = new List<ICommand>();            foreach( ICommand demo in list)            {                if(!demo.execute().isSurccess)                {                    demo.Rollback();                    return;                }            }        }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江华| 安徽省| 钟祥市| 海盐县| 家居| 沿河| 江永县| 从化市| 临安市| 大庆市| 蒙山县| 尚义县| 将乐县| 陆丰市| 英德市| 肇东市| 巴彦淖尔市| 巩留县| 启东市| 巨野县| 汾阳市| 东城区| 临潭县| 廉江市| 枣强县| 顺昌县| 江油市| 南涧| 高安市| 常州市| 额济纳旗| 静宁县| 同心县| 临夏市| 吴川市| 长子县| 聂荣县| 莒南县| 新余市| 扎鲁特旗| 巢湖市|