• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于服務(wù)的插件應(yīng)用程序框架設(shè)計(jì)與實(shí)現(xiàn)

      2014-07-03 18:58:22王陽張俊生
      電腦知識(shí)與技術(shù) 2014年12期
      關(guān)鍵詞:插件服務(wù)

      王陽 張俊生

      摘要: 插件式應(yīng)用程序開發(fā)以其在軟件的分析、設(shè)計(jì)、開發(fā)、維護(hù)、更新升級(jí)等各個(gè)環(huán)節(jié)的巨大的便利性成為近來十分流行的軟件開發(fā)技術(shù)。該文基于.NET Framework平臺(tái)設(shè)計(jì)開發(fā)插件應(yīng)用程序框架,利用程序集實(shí)現(xiàn)插件的加載,利用服務(wù)注冊(cè)技術(shù)將應(yīng)用程序框架設(shè)計(jì)成服務(wù)容器,實(shí)現(xiàn)插件功能的服務(wù)化注冊(cè)管理,無需實(shí)現(xiàn)插件加載與管控所需要的底層技術(shù),極大的簡(jiǎn)化了插件應(yīng)用程序的開發(fā)及擴(kuò)展。

      關(guān)鍵詞:.NET Framework;服務(wù);插件

      中圖分類號(hào):TP319 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)12-2750-03

      Design and Implementation of A Service Based Plugin Framework

      WANG Yang1, ZHANG Jun-sheng2

      (1.caeit,Beijing 100041,China; 2.cetc32,Beijing 200233,China)

      Abstract: The plugin application development become a very popular technology for its huge convenience on analysis, design, development, maintenance, updating of software development .This article is based on .NET Framework platform to design and develop of plugin application framework ,the assembly is used to achieve load the plugin ,the service registration technology is used to design application framework into service container to manage the function of plugin as service without implementing the underlying technology of plugin load and control , all this greatly simplifies the development and expansion of plugin applications.

      Key words: .NET framework; service; plugin

      插件應(yīng)用程序?yàn)槌绦虻臄U(kuò)展提供了無限的想象空間。一個(gè)應(yīng)用程序,無論前期做了多少的市場(chǎng)調(diào)查,需求分析做的多么完美,也只是迎合一部分人的期望,程序發(fā)布以后,依然需要根據(jù)實(shí)際情況增加或完善功能模塊,采用插件式應(yīng)用程序可以讓這些不可預(yù)期變得可控。我們經(jīng)常使用的Visual Studio,Office,Delphi,Eclipse都使用了插件應(yīng)用程序框架。

      插件應(yīng)用程序開發(fā)可以使用微軟COM技術(shù),COM是一種二進(jìn)制重用標(biāo)準(zhǔn),提供了一組接口,開發(fā)人員可以利用這些接口來開發(fā)基于COM的插件,當(dāng)插件開發(fā)完成后,注冊(cè)COM組件;也可以使用普通的DLL,但存在不同廠商標(biāo)準(zhǔn)不一不通用的問題。以上這兩種技術(shù)都沒有提供一個(gè)統(tǒng)一的插件功能的管理,當(dāng)新開發(fā)的插件需要引用已有的插件功能時(shí),只能點(diǎn)對(duì)點(diǎn)實(shí)現(xiàn)功能調(diào)用,軟件規(guī)模達(dá)到一定程度時(shí)容易出現(xiàn)邏輯混亂。

      本文采用微軟的.NET Framework平臺(tái)實(shí)現(xiàn)插件的加載與管控。.NET Framework平臺(tái)已經(jīng)實(shí)現(xiàn)了插件加載與管控所需要的底層技術(shù),程序開發(fā)者可以將精力投入到程序架構(gòu)與流程的設(shè)計(jì)當(dāng)中。該文利用程序集Assembly類實(shí)現(xiàn)插件的加載,利用服務(wù)注冊(cè)技術(shù)將應(yīng)用程序框架設(shè)計(jì)成服務(wù)容器,實(shí)現(xiàn)插件功能的服務(wù)化注冊(cè)管理,極大的簡(jiǎn)化了插件應(yīng)用程序的開發(fā)及擴(kuò)展。

      1 關(guān)鍵技術(shù)介紹

      1.1 程序集

      程序集是 .NET Framework 應(yīng)用程序的構(gòu)造塊,旨在簡(jiǎn)化應(yīng)用程序部署并解決在基于組件的應(yīng)用程序中可能出現(xiàn)的版本控制問題,是構(gòu)成部署、版本控制、重復(fù)使用、激活范圍控制和安全權(quán)限的基本單元,是為協(xié)同工作而生成的類型和資源的集合,這些類型和資源構(gòu)成了一個(gè)邏輯功能單元。程序集向公共語言運(yùn)行時(shí)提供了解類型實(shí)現(xiàn)所需要的信息。程序集可以是靜態(tài)的或動(dòng)態(tài)的。靜態(tài)程序集可以包括 .NET Framework 類型(接口和類),以及該程序集的資源(位圖、JPEG 文件、資源文件等)。靜態(tài)程序集存儲(chǔ)在磁盤上的可遷移可執(zhí)行 (PE) 文件中,動(dòng)態(tài)程序集直接從內(nèi)存運(yùn)行并且在執(zhí)行前不存儲(chǔ)到磁盤上。程序集主要執(zhí)行以下功能:

      1)包含公共語言運(yùn)行時(shí)執(zhí)行的代碼。如果可遷移可執(zhí)行 (PE) 文件沒有相關(guān)聯(lián)的程序集清單,則將不執(zhí)行該文件中的 Microsoft 中間語言 (MSIL) 代碼。

      2)程序集形成安全邊界。程序集就是在其中請(qǐng)求和授予權(quán)限的單元。有關(guān)應(yīng)用于程序集的安全邊界的更多信息,請(qǐng)參見 程序集安全注意事項(xiàng)。

      3)程序集形成類型邊界。每一類型的標(biāo)識(shí)均包括該類型所駐留的程序集的名稱。在一個(gè)程序集范圍內(nèi)加載的 MyType 類型不同于在其他程序集范圍內(nèi)加載的 MyType 類型。

      4)程序集形成引用范圍邊界。程序集的清單包含用于解析類型和滿足資源請(qǐng)求的程序集元數(shù)據(jù)。它指定在該程序集之外公開的類型和資源。該清單還枚舉它所依賴的其他程序集。

      5)程序集形成版本邊界。程序集是公共語言運(yùn)行時(shí)中最小的可版本化單元,同一程序集中的所有類型和資源均會(huì)被版本化為一個(gè)單元。程序集的清單描述您為任何依賴項(xiàng)程序集所指定的版本依賴性。有關(guān)版本控制的更多信息,請(qǐng)參見 程序集版本控制。endprint

      6)程序集形成部署單元。當(dāng)一個(gè)應(yīng)用程序啟動(dòng)時(shí),只有該應(yīng)用程序最初調(diào)用的程序集必須存在。其他程序集(例如本地化資源和包含實(shí)用工具類的程序集)可以按需檢索。這就使應(yīng)用程序在第一次下載時(shí)保持精簡(jiǎn)。有關(guān)部署程序集的更多信息,請(qǐng)參見 部署應(yīng)用程序。

      7)程序集是支持并行執(zhí)行的單元。有關(guān)運(yùn)行多個(gè)程序集版本的更多信息,請(qǐng)參見 程序集和并行執(zhí)行。

      程序集的對(duì)應(yīng)實(shí)現(xiàn)為Assembly類,使用 Assembly 類可以加載程序集、瀏覽程序集的元數(shù)據(jù)和構(gòu)成部分、發(fā)現(xiàn)程序集中包含的類型以及創(chuàng)建這些類型的實(shí)例。Assembly 類提供了靜態(tài)方法LoadFile實(shí)現(xiàn)基于路徑標(biāo)識(shí)的動(dòng)態(tài)加載,可以使用GetName方法返回一個(gè) AssemblyName 對(duì)象,該對(duì)象提供對(duì)程序集顯示名稱部分的訪問;GetCustomAttributes 方法列出應(yīng)用于程序集的屬性;GetFiles 方法提供對(duì)程序集清單中文件的訪問;GetManifest ResourceNames方法提供程序集清單中資源的名稱;GetTypes 方法列出程序集中的所有類型;CreateInstance 方法在程序集中搜索和創(chuàng)建類型的實(shí)例。

      1.2 服務(wù)容器

      服務(wù)是.NET Framework設(shè)計(jì)時(shí)架構(gòu)的基礎(chǔ),是提供設(shè)計(jì)時(shí)對(duì)象訪問某項(xiàng)功能的方法實(shí)現(xiàn)。服務(wù)容器負(fù)責(zé)提供、添加和移除服務(wù)。服務(wù)機(jī)制的本質(zhì)是解耦合,是將類型的設(shè)計(jì)時(shí)功能從類型本身剝離出來。如果把類型的設(shè)計(jì)時(shí)功能也封裝到類型里,這樣的類型包含了很多只有開發(fā)人員才會(huì)用到而最終用戶根本不需要的功能,使得類型既臃腫又不便于擴(kuò)展,而將設(shè)計(jì)時(shí)功能剝離出來,這樣類型就可以不依賴于特定的設(shè)計(jì)環(huán)境。

      服務(wù)容器可以包含其它服務(wù)容器,從而形成服務(wù)容器的樹結(jié)構(gòu)。當(dāng)添加服務(wù)時(shí),可以用提升指令來添加,當(dāng)提升服務(wù)時(shí),服務(wù)將向上添加到任何服務(wù)容器,直至達(dá)到服務(wù)容器樹的頂端,這樣就可以提供其它進(jìn)程使用的全局服務(wù)。

      服務(wù)容器的對(duì)應(yīng)實(shí)現(xiàn)為ServiceContainer類,ServiceContainer是.NET提供的IserviceContainer接口的實(shí)現(xiàn),可以使用AddService添加服務(wù),RemoveService移除服務(wù),GetService獲得服務(wù)。

      2 應(yīng)用程序框架設(shè)計(jì)與實(shí)現(xiàn)

      2.1 應(yīng)用程序框架組成

      要實(shí)現(xiàn)插件框架與插件的交互,必須有一個(gè)插件框架與插件交互的準(zhǔn)則,即框架的運(yùn)行不應(yīng)依賴于插件,且能夠獲得插件存在的位置,具備動(dòng)態(tài)加載插件的能力,必須要聲明有哪些功能是可以被插件使用的,定義插件被加載的條件。.NET Framework平臺(tái)下我們可以使用靈活可擴(kuò)展的接口來實(shí)現(xiàn)這個(gè)準(zhǔn)則。

      插件與框架之間的通信可以用服務(wù)注冊(cè)技術(shù)實(shí)現(xiàn)。將主框架申明為一個(gè)根服務(wù)容器,將插件對(duì)外所能提供的功能視為一個(gè)服務(wù),并在接口中申明。插件在被加載的同時(shí),完成插件服務(wù)向根服務(wù)容器的注冊(cè),并由根服務(wù)容器進(jìn)行管理,對(duì)其它插件提供查詢服務(wù)。

      基于以上的設(shè)計(jì)思路,一個(gè)基于服務(wù)的插件式應(yīng)用程序框架應(yīng)由3個(gè)基本部分組成,如圖1所示。主框架負(fù)責(zé)插件與服務(wù)的管理,插件的管理主要負(fù)責(zé)插件的加卸載,服務(wù)管理主要負(fù)責(zé)插件服務(wù)的注冊(cè)、查詢;接口定義主要由插件加載接口與服務(wù)接口組成,插件加載接口定義了要實(shí)現(xiàn)插件框架與插件的交互必須遵循的準(zhǔn)則,每個(gè)插件都必須實(shí)現(xiàn)這個(gè)接口,服務(wù)接口由各個(gè)插件申明,申明各個(gè)插件所能提供的服務(wù);插件由插件加載及插件服務(wù)組成,插件加載實(shí)現(xiàn)了接口定義中的插件加載接口,負(fù)責(zé)與主框架的交互,插件服務(wù)具體實(shí)現(xiàn)了接口定義中申明的服務(wù)接口,負(fù)責(zé)提供實(shí)際的插件功能。

      2.2 應(yīng)用程序框架實(shí)現(xiàn)

      應(yīng)用程序框架的實(shí)現(xiàn)首先從接口開始,接口申明中定義了四種類型的接口,如圖2所示。其中IApplication接口繼承IServiceContainer,負(fù)責(zé)服務(wù)的注冊(cè)與刪除;IPlugin接口定義了插件與主框架交互時(shí)必須實(shí)現(xiàn)的方法與屬性,由插件實(shí)現(xiàn);IPluginService接口是主框架申明的加載插件服務(wù),主要負(fù)責(zé)插件的加載與刪除;IService接口是所有插件服務(wù)接口的基接口,定義了插件服務(wù)必須實(shí)現(xiàn)的基本服務(wù);IMessageDataShowService接口是插件的申明的提供服務(wù)的接口,定義了插件所能提供的服務(wù)。

      應(yīng)用程序框架實(shí)現(xiàn)的第二步是實(shí)現(xiàn)主框架,如圖3所示。主框架主要包含兩個(gè)類,其中MainForm類實(shí)現(xiàn)程序的可視化并且實(shí)現(xiàn)IApplication接口,作為根服務(wù)容器,負(fù)責(zé)服務(wù)的加載、刪除與查詢;PluginService 是接口IPluginService的實(shí)現(xiàn),負(fù)責(zé)實(shí)際完成插件的注冊(cè)、加載與刪除功能。

      最后實(shí)現(xiàn)插件,如圖4所示。MessageDataShowPlugin類實(shí)現(xiàn)IPlugin接口,負(fù)責(zé)與主框架的交互;MessageDataShowService類實(shí)現(xiàn)IMessageDataShowService接口,具體實(shí)現(xiàn)了接口中申明能提供的服務(wù)。

      3 結(jié)束語

      本文闡述了基于服務(wù)的插件式應(yīng)用框架的基本設(shè)計(jì)思想,并實(shí)現(xiàn)了程序運(yùn)行所需的基本模塊,但要在實(shí)際項(xiàng)目中使用框架,還需要讀者勤于思考,對(duì)框架做必要的補(bǔ)充。可在框架中加入數(shù)據(jù)流的管理模塊,將數(shù)據(jù)流從服務(wù)中獨(dú)立出來;將主框架的顯示模塊做成顯示服務(wù),以便顯示的獨(dú)立,便利更新升級(jí);可以應(yīng)用設(shè)計(jì)模式來組織程序的各個(gè)模塊等等。

      參考文獻(xiàn):

      [1] 插件技術(shù)的擴(kuò)展機(jī)制[EB/OL].http://www.ibm.com/developerworks/cn/xml/x-wxxm29.html.

      [2] service container[EB/OL].http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85 ).aspx.endprint

      6)程序集形成部署單元。當(dāng)一個(gè)應(yīng)用程序啟動(dòng)時(shí),只有該應(yīng)用程序最初調(diào)用的程序集必須存在。其他程序集(例如本地化資源和包含實(shí)用工具類的程序集)可以按需檢索。這就使應(yīng)用程序在第一次下載時(shí)保持精簡(jiǎn)。有關(guān)部署程序集的更多信息,請(qǐng)參見 部署應(yīng)用程序。

      7)程序集是支持并行執(zhí)行的單元。有關(guān)運(yùn)行多個(gè)程序集版本的更多信息,請(qǐng)參見 程序集和并行執(zhí)行。

      程序集的對(duì)應(yīng)實(shí)現(xiàn)為Assembly類,使用 Assembly 類可以加載程序集、瀏覽程序集的元數(shù)據(jù)和構(gòu)成部分、發(fā)現(xiàn)程序集中包含的類型以及創(chuàng)建這些類型的實(shí)例。Assembly 類提供了靜態(tài)方法LoadFile實(shí)現(xiàn)基于路徑標(biāo)識(shí)的動(dòng)態(tài)加載,可以使用GetName方法返回一個(gè) AssemblyName 對(duì)象,該對(duì)象提供對(duì)程序集顯示名稱部分的訪問;GetCustomAttributes 方法列出應(yīng)用于程序集的屬性;GetFiles 方法提供對(duì)程序集清單中文件的訪問;GetManifest ResourceNames方法提供程序集清單中資源的名稱;GetTypes 方法列出程序集中的所有類型;CreateInstance 方法在程序集中搜索和創(chuàng)建類型的實(shí)例。

      1.2 服務(wù)容器

      服務(wù)是.NET Framework設(shè)計(jì)時(shí)架構(gòu)的基礎(chǔ),是提供設(shè)計(jì)時(shí)對(duì)象訪問某項(xiàng)功能的方法實(shí)現(xiàn)。服務(wù)容器負(fù)責(zé)提供、添加和移除服務(wù)。服務(wù)機(jī)制的本質(zhì)是解耦合,是將類型的設(shè)計(jì)時(shí)功能從類型本身剝離出來。如果把類型的設(shè)計(jì)時(shí)功能也封裝到類型里,這樣的類型包含了很多只有開發(fā)人員才會(huì)用到而最終用戶根本不需要的功能,使得類型既臃腫又不便于擴(kuò)展,而將設(shè)計(jì)時(shí)功能剝離出來,這樣類型就可以不依賴于特定的設(shè)計(jì)環(huán)境。

      服務(wù)容器可以包含其它服務(wù)容器,從而形成服務(wù)容器的樹結(jié)構(gòu)。當(dāng)添加服務(wù)時(shí),可以用提升指令來添加,當(dāng)提升服務(wù)時(shí),服務(wù)將向上添加到任何服務(wù)容器,直至達(dá)到服務(wù)容器樹的頂端,這樣就可以提供其它進(jìn)程使用的全局服務(wù)。

      服務(wù)容器的對(duì)應(yīng)實(shí)現(xiàn)為ServiceContainer類,ServiceContainer是.NET提供的IserviceContainer接口的實(shí)現(xiàn),可以使用AddService添加服務(wù),RemoveService移除服務(wù),GetService獲得服務(wù)。

      2 應(yīng)用程序框架設(shè)計(jì)與實(shí)現(xiàn)

      2.1 應(yīng)用程序框架組成

      要實(shí)現(xiàn)插件框架與插件的交互,必須有一個(gè)插件框架與插件交互的準(zhǔn)則,即框架的運(yùn)行不應(yīng)依賴于插件,且能夠獲得插件存在的位置,具備動(dòng)態(tài)加載插件的能力,必須要聲明有哪些功能是可以被插件使用的,定義插件被加載的條件。.NET Framework平臺(tái)下我們可以使用靈活可擴(kuò)展的接口來實(shí)現(xiàn)這個(gè)準(zhǔn)則。

      插件與框架之間的通信可以用服務(wù)注冊(cè)技術(shù)實(shí)現(xiàn)。將主框架申明為一個(gè)根服務(wù)容器,將插件對(duì)外所能提供的功能視為一個(gè)服務(wù),并在接口中申明。插件在被加載的同時(shí),完成插件服務(wù)向根服務(wù)容器的注冊(cè),并由根服務(wù)容器進(jìn)行管理,對(duì)其它插件提供查詢服務(wù)。

      基于以上的設(shè)計(jì)思路,一個(gè)基于服務(wù)的插件式應(yīng)用程序框架應(yīng)由3個(gè)基本部分組成,如圖1所示。主框架負(fù)責(zé)插件與服務(wù)的管理,插件的管理主要負(fù)責(zé)插件的加卸載,服務(wù)管理主要負(fù)責(zé)插件服務(wù)的注冊(cè)、查詢;接口定義主要由插件加載接口與服務(wù)接口組成,插件加載接口定義了要實(shí)現(xiàn)插件框架與插件的交互必須遵循的準(zhǔn)則,每個(gè)插件都必須實(shí)現(xiàn)這個(gè)接口,服務(wù)接口由各個(gè)插件申明,申明各個(gè)插件所能提供的服務(wù);插件由插件加載及插件服務(wù)組成,插件加載實(shí)現(xiàn)了接口定義中的插件加載接口,負(fù)責(zé)與主框架的交互,插件服務(wù)具體實(shí)現(xiàn)了接口定義中申明的服務(wù)接口,負(fù)責(zé)提供實(shí)際的插件功能。

      2.2 應(yīng)用程序框架實(shí)現(xiàn)

      應(yīng)用程序框架的實(shí)現(xiàn)首先從接口開始,接口申明中定義了四種類型的接口,如圖2所示。其中IApplication接口繼承IServiceContainer,負(fù)責(zé)服務(wù)的注冊(cè)與刪除;IPlugin接口定義了插件與主框架交互時(shí)必須實(shí)現(xiàn)的方法與屬性,由插件實(shí)現(xiàn);IPluginService接口是主框架申明的加載插件服務(wù),主要負(fù)責(zé)插件的加載與刪除;IService接口是所有插件服務(wù)接口的基接口,定義了插件服務(wù)必須實(shí)現(xiàn)的基本服務(wù);IMessageDataShowService接口是插件的申明的提供服務(wù)的接口,定義了插件所能提供的服務(wù)。

      應(yīng)用程序框架實(shí)現(xiàn)的第二步是實(shí)現(xiàn)主框架,如圖3所示。主框架主要包含兩個(gè)類,其中MainForm類實(shí)現(xiàn)程序的可視化并且實(shí)現(xiàn)IApplication接口,作為根服務(wù)容器,負(fù)責(zé)服務(wù)的加載、刪除與查詢;PluginService 是接口IPluginService的實(shí)現(xiàn),負(fù)責(zé)實(shí)際完成插件的注冊(cè)、加載與刪除功能。

      最后實(shí)現(xiàn)插件,如圖4所示。MessageDataShowPlugin類實(shí)現(xiàn)IPlugin接口,負(fù)責(zé)與主框架的交互;MessageDataShowService類實(shí)現(xiàn)IMessageDataShowService接口,具體實(shí)現(xiàn)了接口中申明能提供的服務(wù)。

      3 結(jié)束語

      本文闡述了基于服務(wù)的插件式應(yīng)用框架的基本設(shè)計(jì)思想,并實(shí)現(xiàn)了程序運(yùn)行所需的基本模塊,但要在實(shí)際項(xiàng)目中使用框架,還需要讀者勤于思考,對(duì)框架做必要的補(bǔ)充??稍诳蚣苤屑尤霐?shù)據(jù)流的管理模塊,將數(shù)據(jù)流從服務(wù)中獨(dú)立出來;將主框架的顯示模塊做成顯示服務(wù),以便顯示的獨(dú)立,便利更新升級(jí);可以應(yīng)用設(shè)計(jì)模式來組織程序的各個(gè)模塊等等。

      參考文獻(xiàn):

      [1] 插件技術(shù)的擴(kuò)展機(jī)制[EB/OL].http://www.ibm.com/developerworks/cn/xml/x-wxxm29.html.

      [2] service container[EB/OL].http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85 ).aspx.endprint

      6)程序集形成部署單元。當(dāng)一個(gè)應(yīng)用程序啟動(dòng)時(shí),只有該應(yīng)用程序最初調(diào)用的程序集必須存在。其他程序集(例如本地化資源和包含實(shí)用工具類的程序集)可以按需檢索。這就使應(yīng)用程序在第一次下載時(shí)保持精簡(jiǎn)。有關(guān)部署程序集的更多信息,請(qǐng)參見 部署應(yīng)用程序。

      7)程序集是支持并行執(zhí)行的單元。有關(guān)運(yùn)行多個(gè)程序集版本的更多信息,請(qǐng)參見 程序集和并行執(zhí)行。

      程序集的對(duì)應(yīng)實(shí)現(xiàn)為Assembly類,使用 Assembly 類可以加載程序集、瀏覽程序集的元數(shù)據(jù)和構(gòu)成部分、發(fā)現(xiàn)程序集中包含的類型以及創(chuàng)建這些類型的實(shí)例。Assembly 類提供了靜態(tài)方法LoadFile實(shí)現(xiàn)基于路徑標(biāo)識(shí)的動(dòng)態(tài)加載,可以使用GetName方法返回一個(gè) AssemblyName 對(duì)象,該對(duì)象提供對(duì)程序集顯示名稱部分的訪問;GetCustomAttributes 方法列出應(yīng)用于程序集的屬性;GetFiles 方法提供對(duì)程序集清單中文件的訪問;GetManifest ResourceNames方法提供程序集清單中資源的名稱;GetTypes 方法列出程序集中的所有類型;CreateInstance 方法在程序集中搜索和創(chuàng)建類型的實(shí)例。

      1.2 服務(wù)容器

      服務(wù)是.NET Framework設(shè)計(jì)時(shí)架構(gòu)的基礎(chǔ),是提供設(shè)計(jì)時(shí)對(duì)象訪問某項(xiàng)功能的方法實(shí)現(xiàn)。服務(wù)容器負(fù)責(zé)提供、添加和移除服務(wù)。服務(wù)機(jī)制的本質(zhì)是解耦合,是將類型的設(shè)計(jì)時(shí)功能從類型本身剝離出來。如果把類型的設(shè)計(jì)時(shí)功能也封裝到類型里,這樣的類型包含了很多只有開發(fā)人員才會(huì)用到而最終用戶根本不需要的功能,使得類型既臃腫又不便于擴(kuò)展,而將設(shè)計(jì)時(shí)功能剝離出來,這樣類型就可以不依賴于特定的設(shè)計(jì)環(huán)境。

      服務(wù)容器可以包含其它服務(wù)容器,從而形成服務(wù)容器的樹結(jié)構(gòu)。當(dāng)添加服務(wù)時(shí),可以用提升指令來添加,當(dāng)提升服務(wù)時(shí),服務(wù)將向上添加到任何服務(wù)容器,直至達(dá)到服務(wù)容器樹的頂端,這樣就可以提供其它進(jìn)程使用的全局服務(wù)。

      服務(wù)容器的對(duì)應(yīng)實(shí)現(xiàn)為ServiceContainer類,ServiceContainer是.NET提供的IserviceContainer接口的實(shí)現(xiàn),可以使用AddService添加服務(wù),RemoveService移除服務(wù),GetService獲得服務(wù)。

      2 應(yīng)用程序框架設(shè)計(jì)與實(shí)現(xiàn)

      2.1 應(yīng)用程序框架組成

      要實(shí)現(xiàn)插件框架與插件的交互,必須有一個(gè)插件框架與插件交互的準(zhǔn)則,即框架的運(yùn)行不應(yīng)依賴于插件,且能夠獲得插件存在的位置,具備動(dòng)態(tài)加載插件的能力,必須要聲明有哪些功能是可以被插件使用的,定義插件被加載的條件。.NET Framework平臺(tái)下我們可以使用靈活可擴(kuò)展的接口來實(shí)現(xiàn)這個(gè)準(zhǔn)則。

      插件與框架之間的通信可以用服務(wù)注冊(cè)技術(shù)實(shí)現(xiàn)。將主框架申明為一個(gè)根服務(wù)容器,將插件對(duì)外所能提供的功能視為一個(gè)服務(wù),并在接口中申明。插件在被加載的同時(shí),完成插件服務(wù)向根服務(wù)容器的注冊(cè),并由根服務(wù)容器進(jìn)行管理,對(duì)其它插件提供查詢服務(wù)。

      基于以上的設(shè)計(jì)思路,一個(gè)基于服務(wù)的插件式應(yīng)用程序框架應(yīng)由3個(gè)基本部分組成,如圖1所示。主框架負(fù)責(zé)插件與服務(wù)的管理,插件的管理主要負(fù)責(zé)插件的加卸載,服務(wù)管理主要負(fù)責(zé)插件服務(wù)的注冊(cè)、查詢;接口定義主要由插件加載接口與服務(wù)接口組成,插件加載接口定義了要實(shí)現(xiàn)插件框架與插件的交互必須遵循的準(zhǔn)則,每個(gè)插件都必須實(shí)現(xiàn)這個(gè)接口,服務(wù)接口由各個(gè)插件申明,申明各個(gè)插件所能提供的服務(wù);插件由插件加載及插件服務(wù)組成,插件加載實(shí)現(xiàn)了接口定義中的插件加載接口,負(fù)責(zé)與主框架的交互,插件服務(wù)具體實(shí)現(xiàn)了接口定義中申明的服務(wù)接口,負(fù)責(zé)提供實(shí)際的插件功能。

      2.2 應(yīng)用程序框架實(shí)現(xiàn)

      應(yīng)用程序框架的實(shí)現(xiàn)首先從接口開始,接口申明中定義了四種類型的接口,如圖2所示。其中IApplication接口繼承IServiceContainer,負(fù)責(zé)服務(wù)的注冊(cè)與刪除;IPlugin接口定義了插件與主框架交互時(shí)必須實(shí)現(xiàn)的方法與屬性,由插件實(shí)現(xiàn);IPluginService接口是主框架申明的加載插件服務(wù),主要負(fù)責(zé)插件的加載與刪除;IService接口是所有插件服務(wù)接口的基接口,定義了插件服務(wù)必須實(shí)現(xiàn)的基本服務(wù);IMessageDataShowService接口是插件的申明的提供服務(wù)的接口,定義了插件所能提供的服務(wù)。

      應(yīng)用程序框架實(shí)現(xiàn)的第二步是實(shí)現(xiàn)主框架,如圖3所示。主框架主要包含兩個(gè)類,其中MainForm類實(shí)現(xiàn)程序的可視化并且實(shí)現(xiàn)IApplication接口,作為根服務(wù)容器,負(fù)責(zé)服務(wù)的加載、刪除與查詢;PluginService 是接口IPluginService的實(shí)現(xiàn),負(fù)責(zé)實(shí)際完成插件的注冊(cè)、加載與刪除功能。

      最后實(shí)現(xiàn)插件,如圖4所示。MessageDataShowPlugin類實(shí)現(xiàn)IPlugin接口,負(fù)責(zé)與主框架的交互;MessageDataShowService類實(shí)現(xiàn)IMessageDataShowService接口,具體實(shí)現(xiàn)了接口中申明能提供的服務(wù)。

      3 結(jié)束語

      本文闡述了基于服務(wù)的插件式應(yīng)用框架的基本設(shè)計(jì)思想,并實(shí)現(xiàn)了程序運(yùn)行所需的基本模塊,但要在實(shí)際項(xiàng)目中使用框架,還需要讀者勤于思考,對(duì)框架做必要的補(bǔ)充。可在框架中加入數(shù)據(jù)流的管理模塊,將數(shù)據(jù)流從服務(wù)中獨(dú)立出來;將主框架的顯示模塊做成顯示服務(wù),以便顯示的獨(dú)立,便利更新升級(jí);可以應(yīng)用設(shè)計(jì)模式來組織程序的各個(gè)模塊等等。

      參考文獻(xiàn):

      [1] 插件技術(shù)的擴(kuò)展機(jī)制[EB/OL].http://www.ibm.com/developerworks/cn/xml/x-wxxm29.html.

      [2] service container[EB/OL].http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85 ).aspx.endprint

      猜你喜歡
      插件服務(wù)
      自編插件完善App Inventor與樂高機(jī)器人通信
      電子制作(2019年22期)2020-01-14 03:16:34
      服務(wù)在身邊 健康每一天
      服務(wù)在身邊 健康每一天
      服務(wù)在身邊 健康每一天
      招行30年:從“滿意服務(wù)”到“感動(dòng)服務(wù)”
      商周刊(2017年9期)2017-08-22 02:57:56
      MapWindowGIS插件機(jī)制及應(yīng)用
      基于Revit MEP的插件制作探討
      火力加強(qiáng)再加強(qiáng)IE插件三劍客
      普陀区| 嵊泗县| 嘉峪关市| 沁源县| 内江市| 噶尔县| 炎陵县| 探索| 定日县| 日喀则市| 象山县| 漾濞| 平邑县| 松江区| 高密市| 清河县| 兴化市| 策勒县| 蒙城县| 北安市| 河南省| 黔西县| 左云县| 南昌县| 宕昌县| 鄯善县| 蓬安县| 凉山| 无棣县| 交口县| 修文县| 潜江市| 巩义市| 玉树县| 兴山县| 大化| 陆河县| 惠东县| 墨江| 嘉鱼县| 铅山县|