天天看點

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

一、前言

     AgileEAS.NET SOA 中間件平台是一款基于基于靈活并行開發思想和Microsoft .Net構件(元件)開發技術而建構的一個快速開發應用平台。用于幫助中小型軟體企業建立一條适合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速适應市場變化的目的。

     AgileEAS.NET SOA中間件平台提供了靈活快速開發軟體工程的最佳實踐,通過提供大量的基礎支撐功能如IOC、ORM、SOA、分布式體系及靈活并發開發方法所支撐的插件開發體系,以及提供了大量的實體、資料模型設計生成工具、代碼生成工具,用于幫助中小軟體開發商快速成長。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     AgileEAS.NET平台充分把握目前軟體行業快速發展的新趨勢,基于靈活并行開發、快速适應市場這樣淳樸的軟體工程實踐,采用業界廣泛使用的Microsoft .Net構件(元件)開發技術實踐了這種開發思想,幫助軟體企業實作“靈活變化、快速适合”的目标,進而幫助軟體企業在激烈的市場競争中赢得先機并獲得更高的回報。

二、關于領域模型設計器

      AgileEAS.NET SOA 中間件平台一直努力為廣大的程式員弟兄們提供更友善、更輕松、更簡單的開發體驗,是以除了提供容器、ORM、Linq、通信、SOA、消息總線等各種強大的類庫之外,還努力為廣大的程式員弟兄們提供優秀的開發工具集,其中就包括我們認為了最有價值的領域模型設計器。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

      AgileEAS.NET SOA 中間件平台領域模型設計器提供領域(資料庫)模組化、資料庫文檔生成、實體代碼(業務或其他代碼)生成、DDL腳本生成有等一系列強大的功能。

      領域模型設計器不僅支援對單一模型的定義,也可以定義各種模型之間的關系,目前支援子產品的引用實體(類似外鍵引用)、子實體(父子關系)定義,也支援擴充的屬性和枚舉對象的關聯引用定義。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器
基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器
基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器
基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器
基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     應用AgileEAS.NET SOA 中間件進行開發,我們倡導使用優先進行模型設計的思路,而不是優先進行資料庫結構設計,一是思路上面模型優先,另外一個是當完後模型之後,系統就能導出資料庫設計文檔,大大節省重複工具,并且能提高文檔效率。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     基于此種思路也能保證文檔與資料庫、代碼是強一緻的,不會産生文檔與程式,與資料庫對不上的情況,這種情況在很多很多的軟體企業應該是常事,控制文檔、代碼、資料庫一緻性的成本很高,使用AgileEAS.NET SOA 中間件平台領域模型設計器并應用此種思路則能很好的解決此問題。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     生成模型對應資料表的腳本,目前支援SQLServer、ORACLE、Mysql、SqlLite四種資料庫,DLL腳本可以一個對象一個對象生成,也可以選擇統一生成解決方案之中的所有腳本。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     代碼生成,生成對應的模型定義代碼,單模型代碼以及模型之間的關聯關系,模型與枚舉的關聯關系。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     領域模型設計器提供了直接輸出解決方案的功能,即可以直接生成可供VS開發工具直接打的項目或者解決方案。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

三、領域模型設計器插件機制詳解

     AgileEAS.NET SOA 中間件平台領域模型設計器在衆多的合作夥伴以及社群朋友的使用過程之中,我們一直接受一些客戶和社群朋友的回報進行完善和改進,有很多的社群朋友都有這樣的一個需求,有的朋友開發了自己的ORM架構,但是自己寫一個類似于我們領域模型設計器這樣的功能成本又非常的大,是以希望我們能提供一種插件機制能實作他自己的代碼生成功能,别外,我們的一些客戶在項目之中也需要應用到一些第三方的産品(比如醫院進行內建的ESB平台),這些産品也提供一些二次開發功能,其中就有需求生成模型定義代碼。

      基于各種回報,我們決定為 AgileEAS.NET SOA 中間件平台領域模型設計器提供插件功能,來實作各種客戶和社群朋友的需求,目前我們提供了兩種插件,一種是代碼生成插件,另外是單一的界面插件。

基于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接口,項目代碼結構如下:

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     實作插件接口的必須屬性和方法之後,我們編譯代碼,并且把生成的EAS.MetaDesign.CodeAddIn.AR.dll複制到EAS.MetaDesigner.exe同一目錄,并且打開領域模型設計器進行配置。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     完成設計之後重新打開領域模型設計器,我們打開一個實體,可以看到生成的代碼已經發生了變更:

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     同時在領域模型設計器的“輸出”=》“生成代碼”菜單子項這中,出現了“Castle.AR”菜單,用于輸出整個解決方案代碼。

基于AgileEAS.NET SOA 中間件領域模型資料器快速打造自己的代碼生成器

     到此,我們尼桑:

五、例子代碼下載下傳

     本文涉及的領域模型設計器代碼插件例子,源代碼已經一并放在了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.agileeas.net

官方部落格:http://eastjade.cnblogs.com

github:https://github.com/agilelab/eas

QQ:47920381

AgileEAS.NET QQ群:

113723486(AgileEAS SOA 平台)/上限2000人

199463175(AgileEAS SOA 交流)/上限2000人

116773358(AgileEAS.NET SOA 平台)/上限2000人

郵件:[email protected],[email protected],

電話:18629261335。

作者:魏瓊東

出處:http://www.cnblogs.com/eastjade

關于作者:有13年的軟體從業經曆,專注于中小軟體企業軟體開發過程研究,通過在技術與管理幫助中小軟體企業實作技術層面開源節流的目的。熟悉需求分析、企業架構、項目管理。現主要從事基于AgileEAS.NET平台的技術咨詢工作,主要服務于醫療衛生、鐵路、電信、物流、物聯網、制造、零售等行業。如有問題或建議,請多多賜教!

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,如有問題,可以通過[email protected] 聯系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨論,非常感謝。

繼續閱讀