插件式架構設計實踐:插件式系統架構設計簡介

本系列博文將使用微軟RIA技術解決方案Silverlight以及擴展性管理框架Managed Extensibility Framework(MEF),以插件式架構設計為導線,分享本人在從事基于微軟Silverlight技術構建的RIA系統中實施插件式系統架構設計的相關技術和經驗。鑒于本人能力有限,如有不妥之處請各位朋友指正,大家共同學習、進步,謝謝!

?

  軟件的工業化使得軟件復用已經從通用類庫進化到了面向領域的應用框架。應用框架強調的是軟件的設計重用性和系統的課擴展性,以縮短大型應用軟件系統的開發周期,提高開發質量。應用軟件開發的未來就在于提供一個開放的體系結構,以方便中間件的選擇、組裝和集成,應用框架的重用已成為軟件開發生產中最有效的重用方式之一。面對這種發展趨勢,呼之欲出的便是一種全新的、開放性的、高擴展性的架構體系,這里我將其命名為插件式架構(或許與別人口中的插件式架構有所區別)。

?

一、插件式架構設計概述

  插件式架構設計近年來非常流行,其中Eclipse起了推波助瀾的作用,提到插件式就會不由自主的想到餓Eclipse。其實插件式設計并不是什么新事物,早在幾十年前就有了。像X-Server就是基于插件式設計的,除了核心功能外,它所有的擴展功能和設備驅動都是以插件方式加入進來的。

?

  基于插件的設計好處很多,把擴展功能從框架中剝離出來,降低了框架的復雜度,讓框架更容易實現。擴展功能與框架以一種很松的方式耦合,兩者在保持接口不變的情況下,可以獨立變化和發布。公開插件接口,讓第三方有機會擴展應用程序的功能,有財大家一起發。另外,還可以讓開源與閉源共存于一套軟件,你的插件是開源還是閉源,完全由你自己決定。基于插件設計并不神秘,相反它比起一團泥的設計更簡單,更容易理解。各種基于插件設計的架構都有自己的特色,但從總體架構上看,其模型都大同小異。

?

?  插件式架構設計中主要包括:插件框架、插件契約(服務)以及插件組件三部分組成。

  1、插件框架:組織和管理系統插件的下載、裝載、組合、實例化以及銷毀,并提供整套完整的與后臺服務通信的操作接口等。

  2、插件契約(服務):插件契約以服務接口的形式存在,系統的所有插件全部通過實現系統框架統一的接口規范,偏于有效的組織、管理插件對象。

  3、插件組件:插件組件既為具體的插件程序,實現了插件契約服務的一個獨立的程序。

?

  對于插件式應用框架的開發,關鍵是要識別出框架中的通用點和擴展點。基于這個原則,對于開發插件式應用框架的方法和步驟主要分以下三點:

  1、分析并提取出框架中的通用點

  2、分析并提取出框架中的擴展點

  3、在應用框架的擴展點處根據系統配置信息動態加載實際需要的程序集(應用插件),動態創建實例對象并調用其服務。

?

二、插件式架構技術選型

  在RIA(Silverlight、Flex等)技術發熱的現在,很多企業已經開始使用RIA技術解決方案進行企業管理系統建設,采用RIA技術進行系統建設的最大優點就是將后臺處理服務程序和前臺UI展現實現了完全分離,且后臺實現也不受到任何技術活平臺的限制,使系統的整體建設靈活性增強、以及提高對其他外部系統的集成能力。之所里選擇微軟RIA技術解決方案Silverlight技術來實現插件式系統架構,主要取決于以下優點:

  1、Silverlight發布的動態連接庫(.dll)或程序包(.xap)更容易實現插件式架構。

  2、Silverlight支撐Socket的及時消息通信。

  3、Silverlight開發與Blend界面設計完美結合,更容易、快捷的實現UI風格。

  4、基于HttpService/WebService/WCF的分布式通信服務借口,提高多系統異構集成能力。

  5、應用統一的系統樣式,更容易、方便的實現系統多UI風格。

  6、友好的全屏模式及獨特的OOB(Out-Of-Browser)模式支持。

  7、更多......

?

?三、插件式架構設計的優點

  可以說任何形式的架構設計實踐工作無非就是從負責、繁瑣的的研發過程中尋找一種相對方便、靈活、穩定、高擴展性的以及更加簡單的一種新型技術實現方式,從而提高項目的整體開發進度和質量,減少開發人員的工作壓力,間接的提高整個項目團隊的工作效率。

  采用插件式架構設計的優點主要體現在以下幾個方面:

  1)、降低系統各模塊之間的互依賴性

    在進行插件式開發中,任何一個系統功能模塊、通用用戶界面以及最小的圖標等都可以插件的方式進行開發,從而提高了通用功能模塊的重用性;各個功能進行獨立開發,相互之間不存在互依賴性,使各個獨立的功能都可以單獨運行,也可以通過插件框架進行托管運行,從而提高了整個系統的靈活性;對于修改功能模塊也不會影響到其他插件模塊的正常運行,降低了系統的維護難度,提高了系統的可擴展性。 

  2)、系統模塊獨立開發、部署、維護

  每個功能模塊都可以按照插件契約服務接口所定義的服務接口以及相關的元數據的形式當做一個插件進行獨立開發,開發完成編譯后可獨立運行,也可通過插件框架進行托管運行。理論上插件組件是不應該可以單獨運行的,按照插件式架構原理來說,必須是通過插件管家托管才能運行。實際的開發中或許會因為各種的業務需求不同而不同,具體應該如何對插件開發進行約束,還得結合實際項目需求而定。

?

  3)、根據需求動態的組裝、分離系統

?    每個功能模塊都可以當做一個插件進行開發,通過統一的配置文件維護插件包的部署信息,插件框架可根據活動情況動態從服務器上下載相應的xap插件包或者是.dll的動態庫文件到客戶端進行插件初始化創建,插件到框架的組合等,插件框架能夠靈活的管理各個插件實例以及插件之間的通信機制,也支持插件的卸載。

?

三、插件式架構組件(MEF)

  在MEF之前,人們已經提出了許多依賴注入框架來解決應用的擴展性問題,比如OSGI 實現以Spring 等等。在 Microsoft 的平臺上,.NET Framework 自身內部包含組件模型和 System.Addin。同時存在若干種開源解決方案,包括 SharpDevelop 的 SODA 體系結構和“控制反轉”容器(如 Castle Windsor、Structure Map、Spring.Net 以及Unity)。

  雖然.NET平臺下,包括MS在內的各種方案已經遍地開花,但是MEF是第一個隨著CLR發布的解決方案。

官方說法: Managed Extensibility Framework(MEF)是.NET平臺下的一個擴展性管理框架,它是一系列特性的集合,包括依賴注入(DI)以及Duck Typing等。MEF為開發人員提供了一個工具,讓我們可以輕松的對應用程序進行擴展并且對已有的代碼產生最小的影響,開發人員在開發過程中根據功能要求定義一些擴展點,之后擴展人員就可以使用這些擴展點與應用程序交互;同時MEF讓應用程序與擴展程序之間不產生直接的依賴,這樣也允許在多個具有同樣的擴展需求之間共享擴展程序。

?

  本系列文章所討論的插件式框架的設計采用.NET 4.0中的MEF框架作為核心組件,MEF的詳細可查看我寫的《MEF程序設計指南》系列博文。

?

推薦資料:

  《MEF程序設計指南》:http://www.cnblogs.com/beniao/archive/2010/08/11/1797537.html

  《Silverlight動畫開發教程》:http://www.cnblogs.com/beniao/archive/2010/04/04/1703992.html

  《一步一步學Silverlight教程》:http://www.cnblogs.com/Terrylee/archive/2008/03/09/Silverlight2-step-by-step-Tutorials.html

  《Silverlight MSDN?Webcast》:http://www.msdnwebcast.net/webcast/2098.aspx



插件式架構設計實踐二:基于Silverlight的B/S插件式架構設計方法

架構設計并不是項簡單的工作,架構設計最終的產物則是由不同的框架組件構成一套高擴展、穩定、安全、通用的開發框架平臺。或許一提到架構設計,很多朋友都聯想到了常用的框架組件:數據訪問組件、日志組件、事務組件、消息組件、配置組件以及工具庫等。然而,本系列文章的中心“插件式框架設計”已經偏離了常規的框架設計方法論,它只是一套用于改善系統功能模塊組織結構,靈活開發、部署、維護的一套方法論,其中的每個功能模塊的具體實現還是走常規的開發框架,它自身的職責則主要是負責根據配置文件實現系統功能模塊的組裝,靈活的卸載某個部件以及各部件之間如何通信等。

  

  本篇將和大家分享基于Silverlight的B/S插件式架構設計的方法,文中的內容僅僅只是我個人知識、經驗的總結,如有不妥之處還望各位讀者給予指正,大家共同學習,進步。

?

  對于Silverlight項目而言,前端系統需要后臺服務接口的支撐才能完成數據通信訪問、儲存數據的的功能。通常需要給Silverlight前端提供相應的數據通信接口,可分為多種方式提供,常用的數據通信接口分別有Socket、HttpHandler、WebService以及WCF等方式。詳細的架構模型如下圖所示:      

        

?

  系統后臺采取的技術架構為是豎向分成架構模式+橫向擴展架構模式相結合,分成架構模式也就是眾所周知的三層/多層架構,這里不做詳細介紹;橫向擴展架構模式則為支持橫向業務擴展的架構模式,所有業務組件(我通常稱其為:業務插件)通過實現統一的業務服務接口來擴展系統業務功能,系統框架中的業務組件容器(我通常稱其為:業務插件容器)使用統一的業務服務接口靈活的管理業務組件,實現各組件之間的數據通信、事件通知、以及靈活的構造、銷毀業務組件實例。總上述,這種架構模式我便稱其為插件式架構設計。

?

  插件式架構設計的框架能夠靈活的橫向擴展業務組件的擴展開發,管理業務組件的生命周期等,然而對于RIA應用系統來說,他只需要依賴一個或多個通信接口實現數據通信,不用關心服務后臺的架構以及具體是實現細節。需要注重點則是關于系統前端的框架架構設計,一套基于Silverlight技術的插件式架構設計方法,通過插件框架靈活的加載、組合、初始化并進行托管運行系統插件模塊,是我們期望達到的目的。如上所述,插件式框架的架構圖大致如下所示:

        

?

  系統前端的核心架構受到所采用的技術方案的影響,會演化出不同的架構設計方法和架構風格,?如前面所說我們采用的是RIA的技術Silverlight來進行技術構建,那么在進行系統架構設計中定會受到Silverlight技術自身的一些限制,以至于我們的設計不能按照常規的方法,方式去實現。

?

  Silverlight能夠為用戶提供高用戶體驗的軟件界面,以及傳統的Web應用實現不了的很多功能,且也有很多的局限性,系統功能模塊過多導致發布出來的應用程序包(.xap)過大,導致系統運行中初始化緩慢等諸多問題。我們需要一種全新的、開放性的、高擴展性的架構體系,來緩解這種因為技術自身的缺陷造成的諸多問題,可以實現快速的啟動應用程序初始化界面,根據配置動態組裝系統功能模塊,以及靈活的擴展新的系統功能模塊等功能,我將這種架構體系命名為插件式架構體系(或許與別人口中的插件式架構有所區別)。

        

?

  如上圖所示,描述了插件框架的框架結構,框架由插件容器、插件契約和插件組件(業務功能插件)三大部分組成,擴展開發新的插件組件需要實現插件契約接口,以便插件容器可以靈活的控制插件組件。關于這三大組成部分的作用請查看《插件式架構設計簡介》,本篇對基于Silverlight插件式架構設計方法進行了介紹,下一篇將詳細介紹插件式架構設計的解決方案。

?

推薦資料:

  《MEF程序設計指南》:http://www.cnblogs.com/beniao/archive/2010/08/11/1797537.html

  《Silverlight動畫開發教程》:http://www.cnblogs.com/beniao/archive/2010/04/04/1703992.html

  《一步一步學Silverlight教程》:http://www.cnblogs.com/Terrylee/archive/2008/03/09/Silverlight2-step-by-step-Tutorials.html

  《Silverlight MSDN?Webcast》:http://www.msdnwebcast.net/webcast/2098.aspx


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453669.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十章 動態選路協議

RIP 缺陷: Routing Information Protocol RIP沒有子網的概念在路由器或鏈路發生故障后,需要很長的一段時間才能穩定下來采用跳數作為路由度量忽略了其他一些應該考慮的因素度量最大值為15則限制了可以使用RIP的網絡的大小OSPF Open Shortest Path First …

五種方式讓你在java中讀取properties文件內容不再是難題

2019獨角獸企業重金招聘Python工程師標準>>> 方式1.通過context:property-placeholder加載配置文件jdbc.properties中的內容 <context:property-placeholder location"classpath:jdbc.properties" ignore-unresolvable"true"/> 上面的配置…

hive metastore mysql_Hive MetaStore的結構

本篇主要是介紹Hive在MySQL中存儲的源數據的表結構。Hive MetaStore 數據庫表結構圖test.pngTBLS記錄數據表的信息字段解釋TBL_ID在hive中創建表的時候自動生成的一個id&#xff0c;用來表示&#xff0c;主鍵CREATE_TIME創建的數據表的時間&#xff0c;使用的是時間戳DBS_ID這個…

修煉一名程序員的職業水準

程序就是一系列按步驟進行的操作序列&#xff0c;它有好多種級別&#xff0c;比如最低級的微程序、次低級的匯編程序、高級的各種編程語言程序、最高級的腳本語言程序&#xff0c;也許我列的不對&#xff0c;但沒關系&#xff0c;我要說的是不管是那個級別的程序&#xff0c;其…

Rails開發細節《一》

常用命令 rails new new_app cd new_app rake db:create rails server rails generate controller Blog action1 action2 rails generate scaffold Product title:string description:textrails generate model Comment commenter:string body:text post:references rake db…

latex中怎樣使公式居中_LaTeX_多行公式對齊居中的同時選擇性的加編號

標簽: 【轉載請注明出處】http://www.cnblogs.com/mashiqi 2016/10/20 一年多沒寫博文了。今天寫一個短的,記錄一下使用LaTeX的一些經驗。 如何居中多行的公式呢?我試過很多種方法后,覺得下面這個最好用: 1 \begin{flalign*}2 % In this way (this arrange of &), the…

[SDOI2008]Cave 洞穴勘測

題目描述 輝輝熱衷于洞穴勘測。 某天&#xff0c;他按照地圖來到了一片被標記為JSZX的洞穴群地區。經過初步勘測&#xff0c;輝輝發現這片區域由n個洞穴&#xff08;分別編號為1到n&#xff09;以及若干通道組成&#xff0c;并且每條通道連接了恰好兩個洞穴。假如兩個洞穴可以通…

Linux指令大全

名稱&#xff1a;cat 使用權限&#xff1a;所有使用者 使用方式&#xff1a;cat [-AbeEnstTuv] [--help] [--version] fileName 說明&#xff1a;把檔案串連接后傳到基本輸出&#xff08;螢幕或加 > fileName 到另一個檔案&#xff09; 參數&#xff1a; -n 或 --number 由 …

mysql宏參數_C語言帶參數的宏定義

C語言允許宏帶有參數。在宏定義中的參數稱為“形式參數”&#xff0c;在宏調用中的參數稱為“實際參數”&#xff0c;這點和函數有些類似。對帶參數的宏&#xff0c;在展開過程中不僅要進行字符串替換&#xff0c;還要用實參去替換形參。帶參宏定義的一般形式為&#xff1a;#de…

自定義過濾器

首先在web.xml中對過濾器的監聽 1 <!-- 自定義過濾器 -->2 <filter>3 <filter-name>AscFilter</filter-name>4 <filter-class>com.llh.filter.AscFilter</filter-class>5 </filter>6 <filter-mapping>7 …

[MS Sql Server術語解釋]預讀,邏輯讀,物理讀

在MSSQL中使用 SET STATISTICS IO ON 打開IO統計功能之后&#xff0c;每次執行完一個查詢就會在下面的【消息】面板中顯示本次查詢IO的統計信息。 (0 行受影響) 表 demo。掃描計數 1&#xff0c;邏輯讀取 622 次&#xff0c;物理讀取 0 次&#xff0c;預讀 0 次&#xff0c;lob…

mysql 數據庫查詢測試_MySQL查詢測試經驗

測試表geoinfo,整個表超過1100萬行&#xff0c;表結構&#xff1a;CREATE TABLEgeoinfo (objectidint(11) NOT NULLAUTO_INCREMENT ,latitudedouble NOT NULL,longitudedouble NOT NULL,occupancybit(1) NOT NULL,timedatetime NOT NULL,cabidvarchar(16) NOT NULL,PRIMARY KEY…

更改阿里云域名解析臺里某個域名綁定的IP之后不能解析到新IP

1.由于要撤銷一組負載均衡&#xff0c;所以需要更改阿里云域名解析臺里某個域名由原來綁定的負載均衡公網IP換到服務器公網IP 2.在服務器上nginx指定了域名訪問&#xff0c;開啟nginx服務 3.暫時關閉該組負載均衡服務 4.實現通過服務器IP可以訪問項目&#xff0c;域名訪問不了 …

秒懂數據類型的真諦—Python基礎前傳(4)

一切編程語言都是人設計的&#xff0c;既然是人設計的&#xff0c;那么設計各種功能的時候就一定會有它的道理&#xff0c;那么設計數據類型的用意是什么呢&#xff1f; (一) 基本數據類型 基本數據類型&#xff1a; 數字 int字符串 str布爾值 bool列表 list元組 tuple字典 dic…

Linux 系統命令及其使用詳解(大全)

Linux 系統命令及其使用詳解(大全) (來源: 中國系統分析員) cat cd   chmod chown   cp cut   名稱&#xff1a;cat   使用權限&#xff1a;所有使用者   使用方式&#xff1a;cat[-AbeEnstTuv] [--help] [--version] fileName   說明&#xff1a;把檔案串連…

wordpress配置SMTP服務發送郵件

使用SMTP服務發送郵件&#xff0c;需要使用一個插件&#xff1a;http://wordpress.org/extend/plugins/wp-mail-smtp/ 下載完成以后解壓到plugin目錄&#xff0c;然后在插件中啟用這個插件。 配置SMTP服務 SMTP的選項 發送一封測試郵件吧 >>> 本文轉自齊師傅博客園博客…

使用rpm包安裝mysql_centos下利用rpm包安裝mysql

安裝mysql步驟&#xff1a;第一、 http://www.mysql.com/downloads/mysql-4.0.html下載MySQL-client-5.0.96-1.glibc23.x86_64.rpm和MySQL-server-5.0.96-1.glibc23.x86_64.rpm第二、安裝服務端&#xff1a;[rootlfl01 mysql]# rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rp…

maxN - 返回數組中N個最大元素 minN - 返回數組中N個最小元素

從提供的數組中返回 n 個最小元素。如果 n 大于或等于提供的數組長度&#xff0c;則返回原數組&#xff08;按降序排列&#xff09;。 結合使用Array.sort() 與展開操作符(...) &#xff0c;創建一個數組的淺克隆&#xff0c;并按降序排列。 使用 Array.slice() 以獲得指定的元…

Linux 常用命令

Linux之所以受到廣大計算機愛好者的喜愛&#xff0c;主要原因有兩個&#xff0c;首先它是自由軟件&#xff0c;用戶不用支付費用就可以使用它&#xff0c;并可根據自己的需要對它進行修改。另外&#xff0c;它具有Unix的全部功能&#xff0c;任何使用Unix系統或想要學習Unix系統…

使用Server 2008新GPO做驅動器映射

在Server 2003的時代&#xff0c;我們為用戶做網絡驅動器映射(以下就直接稱為Map Network Drive&#xff09;, 通常可能有以下的做法. 方法一: 做一個登錄腳本&#xff0c;放在DC的netlogon目錄&#xff0c;接著在“Active Directory用戶和計算機”控制臺的用戶屬性的Logon S…