首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Visual Studio DSL 入門 4:核心概念與領域模型詳解

     編輯:關於.NET

開發一個 DSL 專案,本質上是在建構幾個核心組件:領域模型、圖形符號、工具箱、模型瀏覽器、屬性視窗、驗證機制、序列化與部署。打開 DslDefinition.dsl 設計介面,中央文件區分為左右兩個「泳道」:

  • 左側:元資料模型(領域模型)——定義領域類別與領域關聯
  • 右側:圖形符號——定義圖表元素的視覺呈現

有趣的是,我們使用 DSL 工具本身來建立 DSL,這些描述性定義本身也是用 DSL 語法表達的。

DslDefinition.dsl 設計介面

領域模型與圖形符號之間透過連接器綁定;領域類別之間透過關聯關係連接。

一、領域模型:DSL 的核心靈魂

每個 DSL 的核心都是一個領域模型,它定義了語言所代表的概念、屬性與關聯。在模型驅動開發中,我們將業務抽象為模型,再用 DSL 語法描述——只要擁有領域模型,工具箱、圖形呈現等皆可自動衍生。

1. 根領域類別

任何 DSL 有且只有一個 根領域類別,它對應整個圖表文件的概念。預設專案範本會自動建立 ExampleModel(根類別)與對應的 ExampleShape(圖形)。

2. 一般領域類別

相對於根類別,ExampleElement 才是真正代表業務實體的模型類別,預設包含一個 Name 字串屬性。

二、領域關聯:串聯模型的紐帶

1. 嵌入關聯

表示「整體-部分」的擁有關係。範例中的 ExampleModelHasElements 將 ExampleModel 與 ExampleElement 連結:

嵌入關聯範例

  • 來源端:屬性名 Elements,型別為集合,重數 0..*,表示可包含零或多個 Element
  • 目標端:屬性名 ExampleModel,型別為單一參考,重數 1..1,表示每個 Element 必須且只能屬於一個 Model
  • 角色名稱:點選關聯線上的角色,可在屬性視窗查看。角色名通常與對端屬性名稱呼應

簡單說:執行時期,一個 Model 可包含多個 Element,每個 Element 只屬於一個 Model。

2. 參考關聯

表示「關聯/引用」關係,通常在圖表上以連線呈現。範例中的 ExampleElementReferencesTargets 連接兩個 ExampleElement:

參考關聯範例

  • 來源與目標皆為 ExampleElement
  • 重數 0..*:一個 Element 可與多個其他 Element 建立參考
  • 注意:這不代表兩個同樣 Element 間可建立多條重複連線。允許重複連線需在關聯屬性中設定 Allows Duplicates = True

3. 關聯程式碼生成客製化

DSL 會為每個領域關聯生成獨立類別,模型中的每條關聯都是該類別的實例。透過屬性視窗的 Code 區段可控制生成策略:

  • 設定 GeneratesDoubleDerived = True:產生雙層類別結構。基底類別(如 ExampleModelHasElementsBase)包含完整實作;衍生類別(ExampleModelHasElements)為 partial class,可覆寫方法注入自訂邏輯
  • 同樣機制也適用於領域類別,可實作自訂介面

關聯程式碼生成屬性設定

三、關鍵概念辨析

領域類別 vs 領域模型

領域模型結構示意

  • 領域模型:虛線框內所有內容的總稱
  • 領域類別:如 Library、Person,代表領域中的型別
  • 領域關聯:連接兩個領域類別的關係資訊
  • 重數:來源端 *(一個 Library 多個 Person),目標端 1(一個 Person 僅屬一個 Library)
  • 來源/目標角色:關聯中雙方扮演的角色

領域屬性 vs 類別屬性

易混淆處:

  • DSL 設計器屬性視窗顯示的是類別本身的中繼屬性(如名稱、描述、顏色等)
  • 領域模型圖面上列出的是領域屬性,它們是領域類別的成員,本身也是模型元素,有自己的屬性(如圖中顯示的 Name 即為領域屬性的名稱)

類別屬性視窗

領域屬性列表

領域屬性詳細屬性

消化這些核心概念,下一步我們將進入實作階段,建立具體的狀態機 DSL 模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved