日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net 插件式开发学习总结

發布時間:2025/4/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net 插件式开发学习总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.NET簡談插件系統開發模式


今天跟大家分享一下我們在日常開發中并不常用的開發模式“插件系統模式”,什么叫插件從大一點的概念講就是我們開發的軟件是由很小的模塊組成,每一塊都能成功的裝卸,使我們的軟件成為一個有機體,在發生重大事故、改良優化等等的時候,我們不需要重新編譯我們的系統就能很方便的進行升級替換進行使用;這樣的開發模式就是插件系統開發模式;這個概念很大,每個人的技術水平不同使用的效果也是不同的;一個大型的系統,不能簡簡單單的用三層或者MVC來概括,我們要站在一個更高的角度去思考程序,每當我們開始一個新系統的架構設計時,我們不能總是保守的或是“封建”式的使用以往的思想模式,是否深思熟慮過這些開始模式在我們當前系統中是否可用或者說是否能發揮模式的最大效果,但是我們往往很多人,不太喜歡思考,俗話說得好:思考是前進的本質;盡量向“建筑的永橫之道”一書中所講的道理去邁進,這書不僅僅在建筑行業是經典,其實在各行各業道理都是想通的,我們不能停止腳步,我們要時刻保持熱身狀態,只有這樣我們才不會在大難臨頭時,渾身無力或者由于肌肉長時間不運動導致反應遲鈍;我寫文章就喜歡亂扯,請大家不要見怪,本人屬于一種很討厭自以為是的那些家伙,

插件系統在很早之前就出現了,包括我們的VisualStudio開發工具的原型都是用的這種模式,我上面也說了每個人的技術水品不同使用的效果也是不同的,我跟大家分享一下我對插件模式的理解和在項目中的使用經驗;我將插件系統大體抽象成下圖結構:

1:

上圖很清晰的描述了我們插件系統的整體執行步驟,我們將應用程序的整個生命周期進行抽象(抽象是我們程序員必備思想,要隨時具備抽象化準備),不管什么應用程序都有前后執行順序,我只是用Main表示一下,在開始執行前我們需要讀取插件所在的路徑然后進行插件對象的全路徑保存,以便在后面運行時方便加載;到了Run開始真正的執行我們的應用程序了,我們需要根據插件的類型進行加載,插件必須具備類型的原則,用在什么地方的,好比汽車的零部件,我們有明確的規定,這里的實現我們可以用接口進行標識;當程序開始結束的時候,我們需要釋放各個插件所占用的系統資源,為什么我們要手動釋放這些資源呢,有的朋友會說不是用CLR的GC嗎?GC只能釋放托管資源,非托管資源它管不到,在我們進行P/Invoke平臺調用時候,資源釋放是比較復雜的,由于托管和非托管的內存分配是不同的,至于怎么釋放非托管資源我這里穿插一下我比較喜歡的方法吧,當我們用非托管C++編寫核心且高效的系統功能時,往往它占用的資源是非??捎^的,所以當我們調用完畢后在第一時間釋放是必須的,我們可以進行托管封裝,在非托管內部我們定義釋放資源的方法,然后在通過P/Invoke調用釋放資源的非托管方式進行釋放;由于這里牽扯到.NET互操作方面的知識了,這這篇文章中我們就涉及了;有興趣的朋友可以關注本人的“《.NET程序員學互操作》”分類文章中進行詳細的講解;

大概的原理我就講這么多了,我們來看代碼怎么實現吧;

2:

在我的解決方案中,Plug是插件有關的對象;在PlugInterface里面是所有插件接口,在LoadInterface文件里面是所有加載過程中的插件,我們需要明確插件的類型,只有這樣才能很好的控制插件;軟件的生命周期隨著需求不同而不同,這里是需要我們去收集和提取的,在應用程序的整個生命周期中我們都可以無縫的裝卸插件,那是多么美妙的事情;

3:

這是本人在公司的一個項目中的實現代碼,由于代碼屬于公司所有,所以不便于公開;其實代碼沒什么技術含量就看怎么用了;OK,差不多講完了;
========

NET實現之(ActiveX插件開發)

決定通過簡單的方式盡量讓初學者少接觸底層的東西包括OLE(對象連接與嵌入)、COM(組件對象模型)之類的概念,但是ActiveX插件在開發上有很高的技術要求,雖然.NET為我們封裝了很好的實現途徑,但是我們也總不能停留在,知自然而不知其所以然的層面上;今天這篇文章我大概構思了一下,我主要會由淺入深的去逐層的講解,對一些概念性的東西,我會給出參考資料供大家去學習,由于它的發展歷史我也就不去講解了,主要是實現為主;如果喜歡刨根問底的朋友可以去查詢相關的文章或者看一些關于OLE、COM方面的書籍,就算我們不從事相關開發,但是對于我們進行.NET互操作方面還是很有幫助的,也不至于讓我們覺得.NET的局限性;本人向大家推薦一本OLE方面的好書:《OLE 2高級編程技術》
其實說起ActiveX插件大家都會想起Flash插件,對Flash插件就是一個很典型的COM組件,宿主在以OLE為容器的Web瀏覽器應用程序中,我們把這個OLE容器稱為復合文檔應用,復合文檔應用程序在微軟的系統到處可見如:Office就是一個很強大的復合文檔應用程序,為什么要稱為復合文檔應用程序呢,是因為以容器為宿主的時候,可以進行任何應用集成開發,在office里面我們可以進行圖表的編輯、Excel的編輯等等;在這個OLE中使用的對象嚴格意思上講都是COM組件,對COM不了解的朋友可以去看一下《COM本質論》也是一本很好的書籍,其實COM就是組件對象模型,是二進制的組件,在任何平臺任何語言之間都能使用;它是一套組件規范一套開發標準,大家都去遵守這個約定,才能使不同廠商生產的組件互相調用;而ActiveX插件就是一個COM組件,在早期的開發中對COM的開發是一種望而生畏的感覺,也許我們做.NET開發的程序的感覺開發組件DLL可能并沒有多大難度,不需要去了解一些操作系統底層的東西比如:函數在編譯過后重新編碼對調用產生的影響,不同操作系統對可執行文件的內存分配回收等等問題,都需要開發組件的人了如指掌之后才能開發出出色的COM組件,然而在今天我們站在.NET這艘航母上,不需要害怕這些復雜的技術難題,微軟為我們打開一扇通往平坦大道的大門,用最簡單的方式去開發最復雜的東西,從某種角度講是好事,壞事就是讓我們越來越遠離核心的東西; 這就要看每個人對技術的追求目標了;
由于.NET開發出來的東西都是屬于托管的,所以不是正真意義上的二進制標準,這就牽扯到.NET平臺調用的技術P/Invoke和互操作Interop技術,但是我們不了解也沒關系,這不影響我們開發ActiveX插件,我只是給大家指一個方向;用.NET開發出來的東西要想完全替代COM組件,因為OLE容器只接受COM組件才能使用,所以我們的托管DLL文件怎樣才能被OLE容器調用呢,就是通過.NET互操作COM來實現,我們開發的ActiveX插件要被瀏覽器這么一個大強的復合文檔程序加載和使用的,所以我們得將托管的組件包裝成非托管的等價的COM組件才行,.NET提供了CCW(COM可調用包裝)的機制,將我們的ActiveX插件通過中間轉換一下就可以使用了,理論的東西我就到此結束,我們開始動手做一個ActiveX插件吧;先看一下ActiveX插件的運行圖;
1:

這是系統在運行過程中要經歷的過程調用步驟,有助于我們下面的開發講解;首先是瀏覽器接受到遠程服務器返回的HTML文本,然后瀏覽器將HTML轉換成DOM對象在通過GDI或者GDI+進行繪制渲染等界面呈現工作,發現在HTML中包含了對本地機器上的COM組件調用,通常也就是我們HTML中的object標簽所定義的說明;在標簽中會包含COM組件的唯一標識符GUID(全局唯一ID),在我們機器存在著成千上萬個COM組件,只有通過GUID才能確定是哪一個組件,瀏覽器通過GUID到注冊表中去查找這個COM組件在本機注冊時的地址,得到地址后在將其COM組件加載到內容運行;這個過程被我細化了,只要能說明原理就行了;
下面我們進入到VisualStudio工具進行ActiveX插件開發,我們要新建一個項目這個項目必須得以DLL文件的形式存在,但是要是ActiveX插件必須得有界面啊;所以我們新建一個Windows窗體控件庫項目;
2:

新建后會出現一個默認的用戶自定義控件我們隨便放一個按鈕就行了,然后寫點測試代碼;
3:

每一個ActiveX插件都有一個入口地址,這就是COM入口地址;我們就拿我們上面的這個測試界面作為入口地址;我們切換到代碼視圖;
4:
?
我們在這個類的上面添加了兩個特性,ComVisible是否對COM公開,這個特性的意思就是說我們的組件是否能用于COM組件的相關調用查找;如果沒有這個特性我們的組件是不能用作COM調用的;GUID特性就是用來為我們的這個類型確定一個部署到客戶機器的唯一標識符;這個GUID可以通過VisualStudio工具欄中的功能自動創建;我們還差一步就成功完成了這么一個龐大的工程了,我們右擊項目選擇屬性會出來下面這個界面;
5:
?
將為COM互操作注冊勾選上,作用就是為了能與COM等組件進行相互調用了,在我們程序目錄中會生成一個和組件名稱一樣的tlb文件,必須有這個文件我們才能使用這個插件,tlb文件是一個類型庫文件,作用就是將托管DLL文件的所有信息導出成COM規范的接口文件,在這個tlb文件中定義了COM的調用約定;由于COM和.NET組件無法直接交互所以只能通過tlb文件來確定我們的托管的DLL文件中定義哪些東西;我們編譯一下;我們還差一個HTML文件,這個文件隨便是來自哪里都可以,這個HTML文件里面要定義調用我們這個ActiveX插件才行;
6:

我紅色箭頭標記的地方就是Object標記所定義的調用代碼,ID就是為調用的ActiveX插件起的一個名字便于在頁面中通過JS進行互操作;CLASSID是要調用的ActiveX插件在用戶機器上的GUID唯一標識符;CODEBASE如果用戶機器上沒有安裝這個插件則讓瀏覽器幫忙下載的URL地址;其他的標記就是和普通的HTML一樣的了;在此我穿插一下,所有的HTML標記最終都會被轉換成實實在在的對象,而不是我們所謂的HTML純文本;
我們保存HTML文件,并且打開這個文件就能看見ActiveX插件被加載運行了;
7:

我這里之間簡單的講解了一下ActiveX插件的基本創建過程,其實ActiveX插件的功能很強大,對B/S一些的功能只能通過插件來解決如:大文件上傳、視頻采集、照片動態采集等等;插件在部署的時候一定要注意,部署到用戶機器上的時候,在屬性欄中有一個文件注冊方式,一定要選擇為COM注冊這樣才能在注冊表中添加相應的節點;ActiveX插件開發大概就講完了;希望講的還算清晰明了;

========

?.net插件式架構系統

插件式(AddIn)架構,不是一個新名詞,應用程序采用插件式拼合,可以更好的支持擴展。很多著名的軟件都采用了插件式的架構,如常見的IDE:Eclipse,Visual Studio,SharpDevelop等等。
  這些插件式架構在實現上各有特色,但是基本原理大致相同:
定義插件框架,用來下載,創建,銷毀插件,并管理插件間的通信等等。
定義插件契約,定義統一的接口規范。
實現插件組件,組件實現插件契約,在運行時可以被插件框架所發現并集成。
常用的插件在界面打開時即加載,而不常用的在用戶點擊時才首次加載進來。
  關于插件式架構的實現技術,有很多選擇,使用動態鏈接庫的導出函數,使用COM技術或者.net的MEF等等。MEF(Managed Extensibility Framework)是微軟集成在.net framework中的擴展性管理框架,Visual Studio2010就是使用了MEF來管理插件,關于MEF的具體使用,請參見MSDN。
插件式架構應用程序不是什么新奇的東西,把UI布局和UI表現分離,并支持插件式架構是設計時的一些想法,具體到項目應用還需要一定的完善。
引文出處:http://www.cnblogs.com/Zhouyongh/archive/2012/02/16/2353498.html
?
MEF 打造的插件系統?
以實例說話,一起體驗MEF帶來的可擴展性吧
========

SharpDevelop插件架構初探

SharpDevelop AddIn
AddIn Manager Usage
Building Applications with the SharpDevelop Core
1.ICSharpDevelop.Application.addin
? ? Remove Pads
2.StartPage.addin
? ? Make clear Complie Output Path


An addin needs three files:
*.addin
*.dll
*.pdb
It has three types of addin:
1) Pre-Installed
2) AddIn Manager add
3) User Defined:
.addin,.dll,.pdb
compress->.zip
change name->.sdaddin
========

c#插件式開發

http://blog.csdn.net/joyhen/article/details/22905481
MEF:http://www.cnblogs.com/tcjiaan/tag/MEF/
http://blog.csdn.net/jam12315/archive/2008/08/18/2791534.aspx
首先,新建一個類庫,里面定義接口,這里定義兩個方法,一個有返回值的,一個無返回值的。
using System; using System.Collections.Generic; using System.Text; namespace IMsg { ///<summary> /// 這是插件必須實現的接口,也是主程序與插件通信的唯一接口 /// 換句話說,主程序只認識插件里的這些方法 ///</summary> publicinterface IMsgPlug {  void OnShowDlg();  string OnShowInfo(); } }
將上面的類庫生成IMsg.dll, 新建一個類庫MYPlugin1,添加剛出的引用,分別新建兩個類來實現IMsg中定義的接口。

using System; using System.Collections.Generic; using System.Text; using IMsg; namespace MYPlugin1 { publicclass myConsole: IMsgPlug {#region IMsgPlug成員publicvoid OnShowDlg() { Console.WriteLine("控制臺調用插件的OnShowDlg方法"); } publicstring OnShowInfo() { return "myConsole"; }#endregion } } ??
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using IMsg; namespace MYPlugin1 { publicclass MYDlg: Form, IMsgPlug {#region IMsgPlug成員 publicvoid OnShowDlg() { this.Text = "插件子窗體"; this.ShowDialog(); //調用Form的ShowDialog,顯示窗體 } publicstring OnShowInfo() { return "MyDlg"; }#endregion } }
將上面的都生成dll, 生成目錄可以設置為新建exe工程的bin目錄plugins文件夾下。Plugins文件夾是新建的,專門存放插件的。 新建一個 WinForm項目來使用剛才的插件.
using System; using System.IO; using System.Linq; using System.Collections; using System.Windows.Forms; using System.Reflection; namespace myConsole { public partial class Form1 : Form { /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } public Form1() { InitializeComponent(); } /// <summary> /// 存放插件的集合 /// </summary> private ArrayList plugins = new ArrayList(); //載入所有插件 private void btnLoadPlug_Click(object sender, EventArgs e) { string[] files = Directory.GetFiles(Application.StartupPath + "\\plugins"); if (files != null) this.listBox1.Items.Clear(); foreach (var f in files) { if (!f.ToUpper().EndsWith(".DLL")) continue; try { Assembly ab = Assembly.LoadFile(f); Type[] t = ab.GetTypes(); foreach (var x in t) { if (x.GetInterface("IMsgPlug") != null) { plugins.Add(ab.CreateInstance(x.FullName)); this.listBox1.Items.Add(x.FullName); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } //調用插件的方法 private void btnExecute_Click(object sender, EventArgs e) { if (this.listBox1.SelectedIndex == -1) return; object selObj = this.plugins[this.listBox1.SelectedIndex]; Type t = selObj.GetType(); MethodInfo OnShowDlg = t.GetMethod("OnShowDlg"); MethodInfo OnShowInfo = t.GetMethod("OnShowInfo"); OnShowDlg.Invoke(selObj, null); object returnValue = OnShowInfo.Invoke(selObj, null); this.lblMsg.Text = returnValue.ToString(); } } }
運行結果:

此方法用了反射,個人感覺效果不是很好。另外,注意dll對象的依賴,這種問題我在手寫上面demo的時候發現了,首先要保證依賴文件的存在,再一個依賴文件的路徑需要正確。另一點要說下,對反射后的驗證可以做一些加強處理,listbox對象顯示的名字可以通過給dll中對象添加特性標記,然后獲取顯示出來。下一節我們看看MEF的小例子。
最后想說一下,這不是正在意義上的插件式開發,請參閱微軟的MEF和MAF的設計
========

C#實現插件式架構的方法

插件式架構,一種全新的、開放性的、高擴展性的架構體系.插件式架構設計近年來非常流行,基于插件的設計好處很多,把擴展功能從框架中剝離出來,降低了框架的復雜度,讓框架更容易實現。擴展功能與框架以一種很松的方式耦合,兩者在保持接口不變的情況下,可以獨立變化和發布。基于插件設計并不神秘,相反它比起一團泥的設計更簡單,更容易理解。下面已C# .Net簡要介紹一下插件式架構的方法.

定義插件接口,將其編譯成dll
namespace PluginInterface {public interface IPlugin{string Show();} }
編寫插件,引用上面的DLL,實現上面定義的接口,也編譯為DLL
//插件A namespace PluginA {public class PluginA:IPlugin{public string Show(){return "插件A";}} }
//插件B namespace PluginB {public class PluginB : IPlugin{public string Show(){return "插件B";}} }

新建一個控制臺程序,需要引用定義插件接口的dll,生成之后,需要在exe所在的目錄里建一個Plugins子文件夾,將上面生成的PluginA.dll,和PluginB.dll拷貝進去。

namespace ConsolePluginTest {class Program{static void Main(string[] args){Program p = new Program();List<string> pluginpath = p.FindPlugin();pluginpath = p.DeleteInvalidPlungin(pluginpath);foreach (string filename in pluginpath){try{//獲取文件名string asmfile = filename;string asmname = Path.GetFileNameWithoutExtension(asmfile);if (asmname != string.Empty){// 利用反射,構造DLL文件的實例Assembly asm = Assembly.LoadFile(asmfile);//利用反射,從程序集(DLL)中,提取類,并把此類實例化Type[] t = asm.GetExportedTypes();foreach (Type type in t){if (type.GetInterface("IPlugin") != null){IPlugin show = (IPlugin)Activator.CreateInstance(type);Console.Write(show.Show());}}}}catch(Exception ex){Console.Write(ex.Message);}}}//查找所有插件的路徑private List<string> FindPlugin(){List<string> pluginpath = new List<string>();try{//獲取程序的基目錄string path = AppDomain.CurrentDomain.BaseDirectory;//合并路徑,指向插件所在目錄。path = Path.Combine(path,"Plugins");foreach (string filename in Directory.GetFiles(path, "*.dll")){pluginpath.Add(filename);}}catch(Exception ex){Console.Write(ex.Message);}return pluginpath;}//載入插件,在Assembly中查找類型private object LoadObject(Assembly asm, string className, string interfacename, object[] param){try{//取得className的類型Type t =asm.GetType(className);if (t == null|| !t.IsClass|| !t.IsPublic|| t.IsAbstract|| t.GetInterface(interfacename) == null){return null;}//創建對象Object o = Activator.CreateInstance(t,param);if (o == null){//創建失敗,返回nullreturn null;}return o;}catch{return null;}}//移除無效的的插件,返回正確的插件路徑列表,Invalid:無效的private List<string> DeleteInvalidPlungin(List<string> PlunginPath){string interfacename = typeof(IPlugin).FullName;List<string> rightPluginPath = new List<string>();//遍歷所有插件。foreach (string filename in PlunginPath){try{Assembly asm = Assembly.LoadFile(filename);//遍歷導出插件的類。foreach (Type t in asm.GetExportedTypes()){//查找指定接口Object plugin = LoadObject(asm,t.FullName,interfacename,null);//如果找到,將插件路徑添加到rightPluginPath列表里,并結束循環。if (plugin != null){rightPluginPath.Add(filename);break;}}}catch{throw new Exception(filename+"不是有效插件");}}return rightPluginPath;}} }


========

MEF

?實戰MEF(5):導出元數據
實戰MEF(4):搜索范圍
實戰MEF(3):只導出類的成員
實戰MEF(2):導出&導入
實戰MEF(1):一種不錯的擴展方式
========

開放工廠


開放工廠是一個敏捷、開放、共享、協作、社會化的軟件生產線平臺。它向開發者提供了規范化的OSGi.NET插件框架和可復用的插件倉庫,致力于解決應用系統的模塊化敏捷開發、團隊無縫協作和自動化部署問題。開放工廠向軟件開發商提供了共享的插件倉庫。目前共享插件倉庫擁有超過100個的可直接使用插件,涵蓋了桌面界面框架、Web界面框架、數據庫訪問、數據挖掘、數據集成、大數據支撐、消息隊列、數據加密、文件訪問等各類插件。 軟件生產線 開放工廠向軟件開發商構建了一條自動化的敏捷軟件生產線平臺。這個生產線平臺能夠極大提高軟件開發效率、團隊協作效率,使軟件的生產變得和生產線組裝一樣。 在這里,開發團隊從插件倉庫獲取基礎插件并進行組裝,在此基礎上根據實際需求開發業務邏輯插件,并將業務插件通過自動化部署工具發布/更新到插件倉庫。 測試團隊則從插件倉庫獲取需要測試的插件及其更新包組裝成軟件進行測試,一旦發現問題則反饋給開發團隊。 部署團隊從插件倉庫獲取需要部署的軟件系統的插件進行安裝,并利用開放工廠自動升級功能實現自動化的部署。 軟件生產線 開放工廠為軟件開發商提供了自動化部署機制,為軟件提供商提供了持續部署和持續交付能力,實現了最高級別的“DevOps”。 在這里,當插件變更需要發布時,開發團隊通過鼠標右鍵即可將插件及其后續升級包持續的發布到插件倉庫;管理人員則可以對插件倉庫進行管理。 一旦插件倉庫產生變更后,實際部署環境則通過自動升級/降級機制保持與插件倉庫版本一致,實現應用系統的自動化持續部署。 自動化部署 開放工廠所有插件基于OSGi.NET面向服務插件框架構建。該框架是國際上第一個完整遷移了OSGi R4規范的OSGi.NET框架,提供了動態模塊化、面向服務和模塊擴展三大功能,支持WinForm桌面應用、WPF桌面應用、ASP.NET Web應用、ASP.NET MVC應用、Silverlight RIA應用、手機應用等任意.NET應用環境。 自動化部署 開放工廠架構
開放工廠架構如下所示。開放工廠為用戶提供了公共/私有插件倉庫和插件SDK,允許用戶使用“搭積木”的方式創建 模塊化應用程序。開放工廠為用戶提供的私有插件倉庫允許用戶以項目的形式來管理自己的應用系統的所有插件及其升級包。 此外,它還暴露了開放接口,允許用戶通過開放接口來檢測插件框架等內核文件的變更情況及相應的文件,允許用戶訪問插件倉庫、獲取 插件倉庫插件的變更情況、獲取某個插件的文件?;陂_放工廠的應用系統使用插件SDK來開發應用程序。利用SDK創建的程序可以通過開放接口來獲取插件框架 等內核文件的最新版本并實現自動更新,此外,自帶的系統插件——自動升級與降級插件、插件倉庫訪問與插件管理服務 利用開放接口使應用系統自動與插件倉庫保持同步,并允許我們在任何時候通過插件中心和插件管理界面來安裝、啟動、 停止、卸載插件。開放·工廠結構圖 開放工廠由OSGi.NET插件框架和插件倉庫組成
(1)OSGi.NET插件框架:它是OSGi R4規范移植到.NET平臺的實現,提供了動態模塊化、面向服務架構和模塊擴展三大功能。在這里,模塊具備物理隔離性、熱插拔、動態性和物理重用性。 (2)插件倉庫:它是一個在線的插件倉庫,所有插件均符合OSGi.NET規范,可運行在OSGi.NET插件框架之上。您可以從插件倉庫中任意挑選插件進行組裝,也可以開發新的插件進行功能擴展。 開放·工廠結構圖 開放工廠具有六方面的價值
開放工廠價值 規范的模塊化框架和“積木式”軟件生產線
通過iOpenWorks,軟件開發工程師可以更加關注與業務結合,而無需考慮底層邏輯與實現,徹底解放了系統設計師,方便靈活的開發多領域定制化產品,開發軟件產品(項目)就像“搭積木”,而且由于OSGi采用微內核機制,又可保證系統的穩定高效。 顯著提升系統的設計能力
iOpenWorks能夠更加規范的讓設計師去完成系統設計工作,更加容易先分模塊設計業務架構,后進行模塊詳細設計。所有的設計師都基于一種設計規范,避免百花齊放,每個設計師都有自已一套設計方式,設計上無法通用的弊端。 實現了動態可管理的系統(即插即用)
基于iOpenWorks開發的系統功能模塊(Plugin)可以動態加載或者卸載,而系統本身無需停止,還可以通過遠程管理工具進行功能模塊的遠程安裝、啟動、停止和卸載模塊,或者訂閱模塊倉庫中模塊變更并同步。 建立了規范的團隊并行開發方式、培訓體系
基于iOpenWorks,軟件開發企業所有的項目都可以按照統一的基礎架構、開發方式以及部署方式來完成,很容易形成團隊的并行開發模式,自然而然的很容易形成在開發知識方面的培訓體系。 系統維護成本大大降低
由于基于iOpenWorks開發的系統模塊具有嚴格意義上的模塊化,相對于傳統開發方式,系統模塊的組織、復用和擴展變得容易,也簡化了模塊的測試。當一個系統功能需要修改或者發現Bug時,開發人員只需要修改或者Debug他自己的功能模塊,模塊之間沒有耦合,互不影響,這可以大大降低系統的維護成本。開發新功能也是一個“獨立”的模塊(Plugin),部署只需拷貝到指定目錄,系統即可擁有新功能。 建立企業級可復用軟件資產(構件)庫變得容易
由于所有的系統設計、模塊開發都遵循統一的技術規范,企業所開發項目的所有模塊都可作為高可復用的軟件資產積累下來,企業可建立企業級可復用軟件資產庫,做新項目的時候只需要下載相應的功能模塊進行集成就能實現功能。
========

總結

以上是生活随笔為你收集整理的.net 插件式开发学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。