引言
MEF是微軟的一個擴展性框架,遵循某種約定將各個部件組合起來.而ERP系統的一大特點是模塊化,它們兩者的相性很好,用MEF構建一個ERP系統是相當合適的.下面簡單演示如何構建一個簡單版的ERP系統.
簡單分析
從框架的角度來看,一個好的ERP系統應該至少具備以下兩個特點:
1.模塊開發.一個大型ERP系統要靠團隊開發的,每個人負責的模塊可能都不一樣,要保證低耦合和開發進度,每個模塊必須要能夠獨立開發測試,最終才組合起來.
2.實時更新.ERP系統的模塊經常會有功能性修改,升級頻繁,要保證良好的體驗,不能每次都要用戶重新打開系統更新,我們需要實現后台更新,悄悄用新的模塊替換舊的模塊.
主程序
新建一個WPF項目,添加引用System.ComponentModel.Composition,然后就可以設計開發了.
界面設計,listbox用來顯示所有模塊列表,雙擊模塊名可以打開模塊.而刷新按鈕模擬實時更新,如下:

實現代碼,Compose方法負責將所有有導出特性的dll加載到容器中,窗體的構造方法和刷新按鈕都會調用此方法,代碼如下
private void Compose() { AggregateCatalog Catalog = new AggregateCatalog(); //catalog = new DirectoryCatalog("Modules"); //Catalog.Catalogs.Add(catalog); DirectoryInfo dlldirectory = new DirectoryInfo("Modules"); FileInfo[] fileinfo = dlldirectory.GetFiles(); foreach (FileInfo item in fileinfo) { if (item.Extension== ".dll") { //不采用DirectoryCatalog加載,而采用AssemblyCatalog加載程序集,是為了能夠在程序運行時刪除dll和更新dll. Assembly assembly = Assembly.Load(File.ReadAllBytes(item.FullName)); Catalog.Catalogs.Add(new AssemblyCatalog(assembly)); } } container = new CompositionContainer(Catalog); // container.ComposeParts(this); this.modulelist.ItemsSource = container.GetExports<UserControl, IDictionary<string, object>>().Select(x => x.Metadata["name"]).ToList(); }
listbox雙擊事件方法,如下
private void modulelist_MouseDoubleClick_1(object sender, MouseButtonEventArgs e) { if (this.modulelist.SelectedItem == null) { return; } string modulename = (string)this.modulelist.SelectedItem; Lazy<UserControl, IDictionary<string, object>> tmp = container.GetExports<UserControl, IDictionary<string, object>>().Where(x => (string)x.Metadata["name"] == modulename).FirstOrDefault(); Window win = new Window(); win.Height = 200; win.Width = 300; win.Content = tmp.Value; win.Owner = this; win.Show(); }
模塊開發
新建一個WPF用戶控件項目,添加用戶控件ViewOne,再加上導出特性,代碼如下
[Export(typeof(UserControl))] [PartCreationPolicy(CreationPolicy.NonShared)] [ExportMetadata("name","viewone")] public partial class ViewOne : UserControl { public ViewOne() { InitializeComponent(); // Console.WriteLine("viewone"+DateTime.Now.ToLongTimeString()); } }
同樣的方式可以創建多個模塊,在此,我創建了模塊一和模塊二,還有一個修改過的模塊二,共有3個dll.
模塊組合演示
在主程序的exe的目錄下新建一個文件夾Modules,將模塊一和模塊二的dll復制到里面,啟動程序,打開模塊一和模塊二,我們就會看到

現在,我們可以將修改過的模塊二dll替換掉原來的,按下刷新,打開模塊二看看,它已經變成新的模塊了

小結
本文簡單地演示如何用MEF實現模塊化開發和實時更新,如果要構建一個完整的ERP框架,這還遠遠不夠,或許您需要Prism框架.最后,如果您有更好的建議,請留言,感激不盡!
