【MEF】構建一個WPF版的ERP系統


引言

     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框架.最后,如果您有更好的建議,請留言,感激不盡!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM