一、前言 AgileEAS.NET SOA 中間件平臺是一款基於基於敏捷並行開發思想和Microsoft .Net構件(組件)開發技術而構建的一個快速開發應用平臺。用於幫助中小型軟體企業建立一條適合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速適應市場變化的目的。 AgileEAS. ...
一、前言
AgileEAS.NET SOA 中間件平臺是一款基於基於敏捷並行開發思想和Microsoft .Net構件(組件)開發技術而構建的一個快速開發應用平臺。用於幫助中小型軟體企業建立一條適合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速適應市場變化的目的。
AgileEAS.NET SOA中間件平臺提供了敏捷快速開發軟體工程的最佳實踐,通過提供大量的基礎支撐功能如IOC、ORM、SOA、分散式體系及敏捷併發開發方法所支撐的插件開發體系,以及提供了大量的實體、數據模型設計生成工具、代碼生成工具,用於幫助中小軟體開發商快速成長。
AgileEAS.NET平臺充分把握目前軟體行業快速發展的新趨勢,基於敏捷並行開發、快速適應市場這樣淳樸的軟體工程實踐,採用業界廣泛使用的Microsoft .Net構件(組件)開發技術實踐了這種開發思想,幫助軟體企業實現“敏捷變化、快速適合”的目標,從而幫助軟體企業在激烈的市場競爭中贏得先機並獲得更高的回報。
二、關於領域模型設計器
AgileEAS.NET SOA 中間件平臺一直努力為廣大的程式員弟兄們提供更方便、更輕鬆、更簡單的開發體驗,所以除了提供容器、ORM、Linq、通信、SOA、消息匯流排等各種強大的類庫之外,還努力為廣大的程式員弟兄們提供優秀的開發工具集,其中就包括我們認為了最有價值的領域模型設計器。
AgileEAS.NET SOA 中間件平臺領域模型設計器提供領域(資料庫)建模、資料庫文檔生成、實體代碼(業務或其他代碼)生成、DDL腳本生成有等一系列強大的功能。
領域模型設計器不僅支持對單一模型的定義,也可以定義各種模型之間的關係,目前支持模塊的引用實體(類似外鍵引用)、子實體(父子關係)定義,也支持擴展的屬性和枚舉對象的關聯引用定義。
應用AgileEAS.NET SOA 中間件進行開發,我們倡導使用優先進行模型設計的思路,而不是優先進行資料庫結構設計,一是思路上面模型優先,另外一個是當完後模型之後,系統就能導出資料庫設計文檔,大大節省重覆工具,並且能提高文檔效率。
基於此種思路也能保證文檔與資料庫、代碼是強一致的,不會產生文檔與程式,與資料庫對不上的情況,這種情況在很多很多的軟體企業應該是常事,控制文檔、代碼、資料庫一致性的成本很高,使用AgileEAS.NET SOA 中間件平臺領域模型設計器並應用此種思路則能很好的解決此問題。
生成模型對應數據表的腳本,目前支持SQLServer、ORACLE、Mysql、SqlLite四種資料庫,DLL腳本可以一個對象一個對象生成,也可以選擇統一生成解決方案之中的所有腳本。
代碼生成,生成對應的模型定義代碼,單模型代碼以及模型之間的關聯關係,模型與枚舉的關聯關係。
領域模型設計器提供了直接輸出解決方案的功能,即可以直接生成可供VS開發工具直接打的項目或者解決方案。
三、領域模型設計器插件機制詳解
AgileEAS.NET SOA 中間件平臺領域模型設計器在眾多的合作伙伴以及社區朋友的使用過程之中,我們一直接受一些客戶和社區朋友的反饋進行完善和改進,有很多的社區朋友都有這樣的一個需求,有的朋友開發了自己的ORM框架,但是自己寫一個類似於我們領域模型設計器這樣的功能成本又非常的大,所以希望我們能提供一種插件機制能實現他自己的代碼生成功能,別外,我們的一些客戶在項目之中也需要應用到一些第三方的產品(比如醫院進行集成的ESB平臺),這些產品也提供一些二次開發功能,其中就有需求生成模型定義代碼。
基於各種反饋,我們決定為 AgileEAS.NET SOA 中間件平臺領域模型設計器提供插件功能,來實現各種客戶和社區朋友的需求,目前我們提供了兩種插件,一種是代碼生成插件,另外是單一的界面插件。
代碼生成插件用於替換內置的代碼生成插件,用於生成自己的各種模型代碼,界面生成插件用於處理當前正在打開的解決方案。
為了實現這種需求,我們定義義兩個介面:
代碼生成插件介面ICodeGenerator:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EAS.Design { /// <summary> /// 代碼生成器介面,用於完成代碼生成。 /// </summary> public interface ICodeGenerator { /// <summary> /// 代碼方案名稱。 /// </summary> string Name { get; } /// <summary> /// 生成數據表對象及表列信息生成代碼。 /// </summary> /// <param name="rootEntity">表信息。</param> /// <param name="project">工作項目信息。</param> /// <returns>生成代碼結果。</returns> string GeneratCode(RootEntity rootEntity,Project project); /// <summary> /// 生成枚舉對象代碼。 /// </summary> /// <param name="enumeration">枚舉對象。</param> /// <param name="project">工作項目信息。</param> /// <returns>生成代碼結果。</returns> string GeneratCode(Enumeration enumeration, Project project); /// <summary> /// 輸出/生成解決方法。 /// </summary> /// <param name="project">項目元數據。</param> /// <param name="outputFolder">輸出路徑。</param> /// <param name="haveSolution">是否生成解決方案。</param> void GeneratSolution(Project project, string outputFolder, bool haveSolution = false); } }
ICodeGenerator介面之中定義一個Name屬性,用於返回插件名稱,以及用於生成單一實體和枚舉的GeneratCode方法,以後生成整體解決方案的GeneratSolution定義,要實現自己的代碼生成插件,就必須實現本介面。
界面插件介面IDesignAddIn:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EAS.Design { /// <summary> /// 元數據設計器插件。 /// </summary> public interface IDesignAddIn { /// <summary> /// 插件名稱。 /// </summary> string Name { get; } /// <summary> /// 執行插件。 /// </summary> /// <param name="workProject">當前項目。</param> void Start(Project workProject); } }
IDesignAddIn介面之中定義比較簡單, 除了插件名稱Name定義,就只有一個Start方法,用於處理當前的解決方案項目,在領域模型設計器的插件菜單下的“列名大小寫切換”就是一個內置IDesignAddIn插件,其代碼如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using EAS.Loggers; using EAS.Design.CodeGenerator; namespace EAS.Design.UI { class ColumnNameSwAddIn:EAS.Design.IDesignAddIn { #region IDesignAddIn 成員 string IDesignAddIn.Name { get { return "列名大小寫切換"; } } public void Start(Project workProject) { ColumnNameSwForm form = new ColumnNameSwForm(); form.Project = workProject; form.StartPosition = FormStartPosition.CenterScreen; form.ShowDialog(); } #endregion } partial class ColumnNameSwForm : Form { internal Project Project { get; set; } public ColumnNameSwForm() { InitializeComponent(); } private void btnGenerat_Click(object sender, EventArgs e) { foreach (var item in this.Project.RootEntities) { if (this.rbUpper.Checked && this.cbTableName.Checked && !string.IsNullOrEmpty(item.MapTable)) { item.MapTable = item.MapTable.ToUpper(); } else if (!this.rbUpper.Checked && this.cbTableName.Checked && !string.IsNullOrEmpty(item.MapTable)) { item.MapTable = item.MapTable.ToLower(); } if (this.cbColumnName.Checked) { foreach (var column in item.Properties) { if (string.IsNullOrEmpty(column.ColumnName)) column.ColumnName = column.Name; if (this.rbUpper.Checked) { column.ColumnName = column.ColumnName.ToUpper(); } else { column.ColumnName = column.ColumnName.ToLower(); } } } } MessageBox.Show("處理完成,請重新打開相關模型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } } }
這兩個介面以及介面涉及的數據結構均定義於EAS.Metadata.dll程式集之累,其中:
Project:解決方案,包括其中的實體、枚舉定義。
RootEntity:實體模塊定義。
Enumeration:枚舉對象定義。
四、代碼插件實現、快速打造自己的代碼生成器
此前,有一個朋友自己實現了一個領域模型設計器的代碼生成插件,用於生成Castle ActiveRecord的實體代碼,並且也願意把實現源碼貢獻出來,所以我們就基於此進行一點說明。
要實現代碼生成插件,我們首先要建一個類庫項目,並且引用EAS.Metadata.dll程式集,建立一個類並實現ICodeGenerator介面,項目代碼結構如下:
實現插件介面的必須屬性和方法之後,我們編譯代碼,並且把生成的EAS.MetaDesign.CodeAddIn.AR.dll複製到EAS.MetaDesigner.exe同一目錄,並且打開領域模型設計器進行配置。
完成設計之後重新打開領域模型設計器,我們打開一個實體,可以看到生成的代碼已經發生了變更:
同時在領域模型設計器的“輸出”=》“生成代碼”菜單子項這中,出現了“Castle.AR”菜單,用於輸出整個解決方案代碼。
到此,我們尼桑:
五、例子代碼下載
本文涉及的領域模型設計器代碼插件例子,源代碼已經一併放在了AgileEAS.NET SOA 中間件的最新版之中,請大請通過AgileEAS.NET SOA 中間件平臺官方網站下載,或者通過以下方式下載:
直接下載:AgileEAS.NET SOA 5.2 下載,http://112.74.66.105/downloads/eas/agileeas.net.5.rar。
SVN更新:https://112.74.66.105/svn/eas/5.0,登錄用戶:eas,密碼eas.
AgileEAS.NET SOA 中間件平臺管理員:Administrator,登錄密碼sa。
直接下載的壓縮包可能會有一定的時間差,即有可能不一定是最新版本,建議大家都通過SVN下載最新版本。
六、聯繫我們
為了完善、改進和推廣AgileEAS.NET而成立了敏捷軟體工程實驗室,是一家研究、推廣和發展新技術,並致力於提供具有自主知識產權的業務基礎平臺軟體,以及基於業務基礎平臺了開發的管理軟體的專業軟體提供商。主要業務是為客戶提供軟體企業研發管理解決方案、企業管理軟體開發,以及相關的技術支持,管理及技術咨詢與培訓業務。
AgileEAS.NET平臺自2004年秋呱呱落地一來,我就一直在逐步完善和改進,也被應用於保險、醫療、電子商務、房地產、鐵路、教育等多個應用,但一直都是以我個人在推廣,2010年因為我辭職休息,我就想到把AgileEAS.NET推向市場,讓更多的人使用。
技術團隊成員都是合作多年的老朋友,因為這個平臺是免費的,我們的營運開支主要靠為客戶提供咨詢服務所得,我們都是因為程式員的那種理想與信念堅持,在此我感謝一起奮鬥的朋友和一直支持我們工作的客戶、朋友。
團隊網站:http://www.agilelab.cn,
AgileEAS.NET網站:http://www.smarteas.net
官方博客:http://eastjade.cnblogs.com
QQ:47920381
AgileEAS.NET QQ群:
113723486(AgileEAS SOA 平臺)/上限2000人
199463175(AgileEAS SOA 交流)/上限2000人
116773358(AgileEAS.NET SOA 平臺)/上限2000人
郵件:[email protected],[email protected],
電話:18629261335。