基於AgileEAS.NET SOA 中間件領域模型數據器快速打造本身的代碼生成器

1、前言

     AgileEAS.NET SOA 中間件平臺是一款基於基於敏捷並行開發思想和Microsoft .Net構件(組件)開發技術而構建的一個快速開發應用平臺。用於幫助中小型軟件企業創建一條適合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速適應市場變化的目的。git

     AgileEAS.NET SOA中間件平臺提供了敏捷快速開發軟件工程的最佳實踐,經過提供大量的基礎支撐功能如IOC、ORM、SOA、分佈式體系及敏捷併發開發方法所支撐的插件開發體系,以及提供了大量的實體、數據模型設計生成工具、代碼生成工具,用於幫助中小軟件開發商快速成長。程序員

     AgileEAS.NET平臺充分把握目前軟件行業快速發展的新趨勢,基於敏捷並行開發、快速適應市場這樣淳樸的軟件工程實踐,採用業界普遍使用的Microsoft .Net構件(組件)開發技術實踐了這種開發思想,幫助軟件企業實現「敏捷變化、快速適合」的目標,從而幫助軟件企業在激烈的市場競爭中贏得先機並得到更高的回報。github

2、關於領域模型設計器

      AgileEAS.NET SOA 中間件平臺一直努力爲廣大的程序員弟兄們提供更方便、更輕鬆、更簡單的開發體驗,因此除了提供容器、ORM、Linq、通訊、SOA、消息總線等各類強大的類庫以外,還努力爲廣大的程序員弟兄們提供優秀的開發工具集,其中就包括咱們認爲了最有價值的領域模型設計器。sql

image

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

      領域模型設計器不只支持對單一模型的定義,也能夠定義各類模型之間的關係,目前支持模塊的引用實體(相似外鍵引用)、子實體(父子關係)定義,也支持擴展的屬性和枚舉對象的關聯引用定義。數據結構

image

image

image 

image

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

image

     基於此種思路也能保證文檔與數據庫、代碼是強一致的,不會產生文檔與程序,與數據庫對不上的狀況,這種狀況在不少不少的軟件企業應該是常事,控制文檔、代碼、數據庫一致性的成本很高,使用AgileEAS.NET SOA 中間件平臺領域模型設計器並應用此種思路則能很好的解決此問題。框架

image

     生成模型對應數據表的腳本,目前支持SQLServer、ORACLE、Mysql、SqlLite四種數據庫,DLL腳本能夠一個對象一個對象生成,也能夠選擇統一輩子成解決方案之中的全部腳本。數據庫設計

image

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

image

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

image

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

     AgileEAS.NET SOA 中間件平臺領域模型設計器在衆多的合做夥伴以及社區朋友的使用過程之中,咱們一直接受一些客戶和社區朋友的反饋進行完善和改進,有不少的社區朋友都有這樣的一個需求,有的朋友開發了本身的ORM框架,可是本身寫一個相似於咱們領域模型設計器這樣的功能成本又很是的大,因此但願咱們能提供一種插件機制能實現他本身的代碼生成功能,別外,咱們的一些客戶在項目之中也須要應用到一些第三方的產品(好比醫院進行集成的ESB平臺),這些產品也提供一些二次開發功能,其中就有需求生成模型定義代碼。

      基於各類反饋,咱們決定爲 AgileEAS.NET SOA 中間件平臺領域模型設計器提供插件功能,來實現各類客戶和社區朋友的需求,目前咱們提供了兩種插件,一種是代碼生成插件,另外是單一的界面插件。

image

     代碼生成插件用於替換內置的代碼生成插件,用於生成本身的各類模型代碼,界面生成插件用於處理當前正在打開的解決方案。

     爲了實現這種需求,咱們定義義兩個接口:

     代碼生成插件接口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:枚舉對象定義。

4、代碼插件實現、快速打造本身的代碼生成器

    此前,有一個朋友本身實現了一個領域模型設計器的代碼生成插件,用於生成Castle ActiveRecord的實體代碼,而且也願意把實現源碼貢獻出來,因此咱們就基於此進行一點說明。

     要實現代碼生成插件,咱們首先要建一個類庫項目,而且引用EAS.Metadata.dll程序集,創建一個類並實現ICodeGenerator接口,項目代碼結構以下:

image

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

image

     完成設計以後從新打開領域模型設計器,咱們打開一個實體,能夠看到生成的代碼已經發生了變動:
image

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

     到此,咱們尼桑:

5、例子代碼下載

     本文涉及的領域模型設計器代碼插件例子,源代碼已經一併放在了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下載最新版本。

6、聯繫咱們

     爲了完善、改進和推廣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人

郵件:james@agilelab.cn,mail.james@qq.com,

電話:18629261335。

相關文章
相關標籤/搜索