成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

基于接口的插件機(jī)制-創(chuàng)新互聯(lián)

一、前言

插件,意味著可擴(kuò)展,且宿主程序不依賴于插件,即插即用。這種軟件設(shè)計(jì)方式可以使我們的應(yīng)用程序大化地獲得可擴(kuò)展性、適應(yīng)性和穩(wěn)定性,而且便于軟件的維護(hù)和升級(jí)。在什么場(chǎng)景下使用插件呢?例如在本篇文章中,我個(gè)人有一個(gè)小需求就是希望記事本帶行號(hào),于是我自己寫(xiě)了一個(gè)極簡(jiǎn)易的編輯器(CodeEditor),以這個(gè)編輯器為例,主體程序功能包括常見(jiàn)的新建、復(fù)制、查找、保存等已經(jīng)完成,但是在使用的過(guò)程中發(fā)現(xiàn)需要用到格式化這個(gè)功能,但是我還不想再去改主程序,這種情形下就可以通過(guò)插件來(lái)實(shí)現(xiàn),這樣以后在使用的時(shí)候,只要有新的需求就可以通過(guò)新增插件來(lái)實(shí)現(xiàn),從某種程度上講這也符合了開(kāi)放-封閉的設(shè)計(jì)原則。下面對(duì)插件的定義來(lái)自百度百科。

成都創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、沙河網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為沙河等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

插件(Plug-in)是一種遵循一定規(guī)范的應(yīng)用程序接口編寫(xiě)出來(lái)的程序。其只能運(yùn)行在程序規(guī)定的系統(tǒng)平臺(tái)下(可能同時(shí)支持多個(gè)平臺(tái)),而不能脫離指定的平臺(tái)單獨(dú)運(yùn)行。

二、插件機(jī)制實(shí)現(xiàn)原理

實(shí)現(xiàn)插件機(jī)制的兩大要素:一個(gè)是接口,另一個(gè)是反射。接口其實(shí)是一種“契約”,主程序是通過(guò)這種“契約”來(lái)約束是否存在符合我期望的對(duì)象,如果不符合就不會(huì)去加載該對(duì)象。在CodeEditor中我們約定的接口是IExcutable。而這種“契約”的執(zhí)行就是通過(guò)反射來(lái)達(dá)到目的,主程序中會(huì)通過(guò)反射加載約定好的Plugin文件夾下所有的DLL文件,然后遍歷這些插件并查看是否存在實(shí)現(xiàn)了IExcutable的并且可以實(shí)例化的類,如果有則創(chuàng)建該類的實(shí)例加入集合并返回集合。主程序拿到集合后會(huì)在構(gòu)造函數(shù)中加載這些插件,加載過(guò)程包括動(dòng)態(tài)添加菜單、指定菜單的點(diǎn)擊事件,這樣完整的插件加載過(guò)程就完成了。下面通過(guò)CodeEditor來(lái)具體看下插件的實(shí)現(xiàn)過(guò)程。

三、插件機(jī)制的實(shí)踐

 下面的圖是整個(gè)CodeEditor的目錄結(jié)構(gòu)

基于接口的插件機(jī)制

第三個(gè)CodeEditorControl可以忽略,這個(gè)類庫(kù)是一個(gè)自定義的控件,是實(shí)現(xiàn)一個(gè)帶行號(hào)的文本編輯器的核心組件,但是和本文主題關(guān)系不大。主要看插件接口CodeEditorInterface和插件實(shí)現(xiàn)CodeEditorPlugins以及主程序CodeEditor。這三者的關(guān)系可以通過(guò)以下圖片來(lái)展示。

基于接口的插件機(jī)制

首先從主程序和插件之間的橋梁入手,就是插件的接口,在CodeEditorInterface中的接口IExcutable中有兩個(gè)約定方法,一個(gè)是GetName負(fù)責(zé)返回當(dāng)前的插件名稱,用于主程序獲取并動(dòng)態(tài)加載到菜單中;另一個(gè)是Excute負(fù)責(zé)獲取主程序中文本并執(zhí)行相應(yīng)的操作。代碼如下:

1 public interface IExcutable2 {3     //用于主程序動(dòng)態(tài)創(chuàng)建菜單4     string GetName();5     //執(zhí)行具體的文本操作6     string Excute(string text);7 }

下面是主程序加載符合“契約”的插件對(duì)象的核心代碼,主要作用就是過(guò)濾符合接口的類并實(shí)例化類的對(duì)象,加到集合中:

 1 public class Common 2 { 3     /// <summary> 4     /// 加載插件 5     /// </summary> 6     /// <returns></returns> 7     public static List<IExcutable> GetPlugins() 8     { 9         List<IExcutable> implementObject = new List<IExcutable>();10         //獲取項(xiàng)目根目錄下的Plugins文件夾11         string dir = GetPluginsDir();12         //遍歷目標(biāo)文件夾中包含dll后綴的文件13         foreach (var file in Directory.GetFiles(dir + @"\", "*.dll"))14         {15             //加載程序集16             var asm = Assembly.LoadFrom(file);17             //遍歷程序集中的類型18             foreach (var type in asm.GetTypes())19             {20                 //如果是IExcutable接口21                 if (type.GetInterfaces().Contains(typeof(IExcutable)))22                 {23                     //創(chuàng)建接口類型實(shí)例24                     var IExcutable = Activator.CreateInstance(type) as IExcutable;25                     if (IExcutable != null)26                     {27                         implementObject.Add(IExcutable);28                     }29                 }30             }31         }32         return implementObject;33     }34 35     /// <summary>36     /// 獲取插件目錄37     /// </summary>38     /// <returns></returns>39     static string GetPluginsDir()40     {41         string pluginDir = ConfigurationManager.AppSettings["pluginDir"];42         return pluginDir;43     }44 }

下面的代碼段主要功能是在主程序中為插件分配菜單,綁定公共事件:

 1 /// <summary> 2 /// 創(chuàng)建插件公共事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void Plugin_Click(object sender, EventArgs e) 7 { 8     ToolStripItem item= sender as ToolStripItem; 9     if (null != item)10     {11 12         if (null != item.Tag)13         {14             IExcutable plugin = item.Tag as IExcutable;15             if (null != plugin)16             {17                 CodeContent.RichText=plugin.Excute(CodeContent.RichText);18             }19         }20     }21 }22 23 /// <summary>24 /// 主程序加載插件25 /// </summary>26 private void LoadPlugins()27 {28     List<IExcutable> list = Common.Common.GetPlugins();29     foreach (var Iplugins in list)30     {31         ToolStripMenuItem item = new ToolStripMenuItem(Iplugins.GetName());//動(dòng)態(tài)創(chuàng)建以插件菜單32         item.Name = Iplugins.GetName();33         item.Click += new EventHandler(Plugin_Click);//綁定公共事件34         item.Tag = Iplugins;35         this.Plugins.DropDownItems.Add(item);36     }37 }

其中的GetPlugins方法就是遍歷指定目錄下的DLL文件,并把符合接口約定的對(duì)象加入集合返回給主程序。而GetPluginsDir方法是獲取插件的存儲(chǔ)位置,主要是在配置文件中讀取插件目錄。

 1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3   <startup> 4     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> 5   </startup> 6   <appSettings> 7     <!--配置加載插件目錄--> 8     <add key="pluginDir"  value="CodeEditorPlugins"/> 9   </appSettings>10 </configuration>

 實(shí)現(xiàn)效果如圖:

基于接口的插件機(jī)制

基于接口的插件機(jī)制

轉(zhuǎn)換前的文本,F(xiàn)ormat的作用是把所有的小寫(xiě)字母轉(zhuǎn)為大寫(xiě)。

基于接口的插件機(jī)制

轉(zhuǎn)換后的文本。

四、總結(jié)

這個(gè)迷你編輯器是之前的一個(gè)小程序,整理代碼的時(shí)候發(fā)現(xiàn)的,突然想改造一下使其更符合我的使用要求,就順便加了個(gè)插件機(jī)制。插件機(jī)制是一種良好的軟件設(shè)計(jì)思想,可以在不修改主程序的情況下擴(kuò)展主程序的功能,有時(shí)候一款軟件的插件功能要比主程序自帶的功能要強(qiáng)大得多。應(yīng)用插件機(jī)制要注意幾點(diǎn):

  • 定義接口,也就是主程序與插件的“契約”

  • 應(yīng)用反射,通過(guò)反射來(lái)加載符合接口的類,然后創(chuàng)建該類的對(duì)象調(diào)用接口方法

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞名稱:基于接口的插件機(jī)制-創(chuàng)新互聯(lián)
文章起源:http://jinyejixie.com/article18/ccsggp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作服務(wù)器托管、網(wǎng)站改版、外貿(mào)建站、小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司
大足县| 浑源县| 新巴尔虎右旗| 临海市| 石嘴山市| 大余县| 宜兴市| 修文县| 武威市| 南郑县| 永善县| 灌阳县| 宜丰县| 天长市| 萨嘎县| 舟山市| 阳朔县| 阿克苏市| 保定市| 弥勒县| 方城县| 岫岩| 惠州市| 喀喇沁旗| 中江县| 滦南县| 牙克石市| 酒泉市| 资源县| 吉木萨尔县| 奉化市| 巴彦淖尔市| 潮安县| 陆河县| 桂林市| 盘山县| 晋城| 深州市| 酒泉市| 韶山市| 大宁县|