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

来源:http://www.cnblogs.com/eastjade/archive/2016/06/28/5624318.html
-Advertisement-
Play Games

一、前言 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、消息匯流排等各種強大的類庫之外,還努力為廣大的程式員弟兄們提供優秀的開發工具集,其中就包括我們認為了最有價值的領域模型設計器。

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

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

     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:枚舉對象定義。

四、代碼插件實現、快速打造自己的代碼生成器

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

     要實現代碼生成插件,我們首先要建一個類庫項目,並且引用EAS.Metadata.dll程式集,建立一個類並實現ICodeGenerator介面,項目代碼結構如下:

image

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

image

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

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

     到此,我們尼桑:

五、例子代碼下載

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前已經介紹過, skynet 只是一個輕量框架,不是一個開箱即用的引擎 。能不能用好它,取決於使用者是否清楚知道自己要乾什麼,如果是用 skynet 做網路游戲伺服器,那麼就必須先知道網路游戲伺服器應該如何設計。 在 skynet 發佈版中帶的 example 中,有類似 gate watchdo ...
  • 資源的表現層狀態轉化。 簡單的理解即: 1 URI對應一種"資源"。 2 客戶端與服務端傳輸資源的某種"表現層"。 3 客戶端通過HTTP協議的動詞,對資源進行操作,實現"表現層狀態轉化" 。 ...
  • 上一篇:《 "DDD 領域驅動設計-領域模型中的用戶設計?" 》 開源地址: "https://github.com/yuezhongxin/CNBlogs.Apply.Sample" (代碼已更新) 在之前的項目開發中,只有一個 JsPermissionApply 實體(JS 許可權申請),所以,C ...
  • ZooKeeper 是 Apache 的一個頂級項目,為分散式應用提供高效、高可用的分散式協調服務,提供了諸如數據發佈/訂閱、負載均衡、命名服務、分散式協調/通知和分散式鎖等分散式基礎服務。由於 ZooKeeper 便捷的使用方式、卓越的性能和良好的穩定性,被廣泛地應用於諸如 Hadoop、HBas... ...
  • 隨著唯品會業務的快速發展,訂單量的不斷增長,原有的訂單存儲架構已經不能滿足公司的發展了,特別是在大促高峰期,原訂單庫已經成為搶購瓶頸,已經嚴重製約公司的發展。 唯品會舊訂單庫包含幾十張訂單相關表,舊訂單庫是典型的一主多從架構;主庫容量已接近伺服器物理空間上限,同時也已經達到MySQL的處理上限,很快 ...
  • 現 在主流的Web MVC框架除了Struts這個主力 外,其次就是Spring MVC了,因此這也是作為一名程式員需要掌握的主流框架,框架選擇多了,應對多變的需求和業務時,可實行的方案自然就多了。不過要想靈活運用Spring MVC來應對大多數的Web開發,就必須要掌握它的配置及原理下載地址 。 ...
  • 在《JavaScript設計模式》介紹中,裝飾者模式跟Mixin(混入)模式相比,是另一種可行的對象子類化(Mixin模式乾的事)的替代方案。 裝飾者(Decorator)模式 定義: 給對象動態添加額外的功能。向基本對象添加(裝飾)屬性或方法,而不是進行子類化,它較為精簡。 使用場景: java ...
  • 介面,強大,簡單,交互,跨越平臺 下麵簡單闡述這兩大介面思想 一 REST: REST是一種架構風格,其核心是面向資源,REST專門針對網路應用設計和開發方式,以降低開發的複雜性,提高系統的可伸縮性。 REST提出設計概念和準則為: 1.網路上的所有事物都可以被抽象為資源(resource) 2.每 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...