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

Visual Studio DSL 入門實戰(八):狀態機領域模型建立與元資料定義全流程

     編輯:關於.NET

本章將從 Minimal Language 專案範本出發,逐步建構狀態機 DSL 的核心領域模型:根模型 StateMachine、狀態 State、轉移關係 Transition、動作 Action 及其繼承階層 EntryAction/ExitAction,並引入自訂列舉 StateKind 區分初始/一般/結束狀態,完整示範 DSL 定義、模板轉換與程式碼生成驗證流程。

一、建立專案與調整根模型

  1. 依第三節建立 Minimal Language 專案範本,開啟 DslDefinition.dsl。
  2. 重命名根域類 ExampleModel → StateMachine,關係 ExampleModelHasElements 自動更名為 StateMachineHasElements。
  3. 調整關係左側域角色 Elements 的 Property Name 為 States (注意非 Name),關係自動更新為 StateMachineHasStates。
  4. 調整關係右側域角色 StateMachine 的 Name 為 State。
  5. 重命名域類 ExampleElement → State。

根模型與關係重命名後

提示:Property Name (屬性名) 決定導覽屬性名稱;Name (域角色名) 用於模型內部識別,兩者用途不同。

二、定義狀態間轉移關係

  1. 預設 StateReferencesTargets 即為狀態間引用關係,重命名為 Transition。
  2. 調整 Targets 端:Property Name = Successors、Name = Predecessor。
  3. 調整 Sources 端:Property Name = Predecessors、Name = Successor。

Transition 關係角色調整

三、為 Transition 增加領域屬性

右鍵 Transition → Add Domain Property,新增四個 string 型別屬性:

  • Event (事件)
  • Condition (守衛條件)
  • Action (動作)
  • Label (標籤)

此即構成狀態機元資料核心:事件、條件、動作。

四、引入 StateKind 列舉區分狀態類型

  1. DSL Explorer 根節點 LanguageSm 右鍵 → Add Domain Enumeration,命名 StateKind。
  2. 新增三個列舉值:Normal=0、Initial=1、Final=2。
  3. 為域類 State 新增屬性 Kind,型別選擇 StateKind。

新增 Domain Enumeration

五、建立 Action 階層與嵌入關係

需求:狀態可包含多個進入/退出動作,動作屬於狀態 (嵌入關係)。但 DSL 限制:同一父類不能對同一子類建立多個嵌入關係 (會導致歧義)。解決方案:領域類繼承。

  1. 新增域類 Action,屬性:Label、Code (皆 string)。
  2. 新增兩個子域類 EntryAction、ExitAction (無額外屬性)。
  3. 建立繼承關係:工具箱選 Inheritance,先點 EntryAction 再點 Action;同理 ExitAction 繼承 Action。

建立繼承關係

Action 繼承階層完成

  1. 建立嵌入關係:工具箱選 Embedding Relationship,從 State 指向 EntryAction (Multiplicity: 0..* / 1..1);同理 State → ExitAction。表示一個狀態可擁有零或多個進入/退出動作,每個動作隸屬單一狀態。

六、完整模型檢視與程式碼生成驗證

完成的 DSL 元資料模型全貌:

完整 DSL 元資料模型

  1. 儲存 DSL 定義,點擊工具列 Transform All Templates (轉換所有範本),T4 引擎依模型生成 C# 程式碼。
    重要:每次修改 DSL 定義後必須轉換範本,變更才會生效。大型模型可單獨右鍵 .tt 檔選 Run Custom Tool 加速。
  2. 重新建置方案,檢查編譯錯誤。
  3. 查看生成的 DomainClasses.cs 類別圖,確認域類、關係、繼承、屬性均正確映射:

生成的 DomainClasses 類別圖

出處:https://lonely7345.cnblogs.com/

本文配套原始碼下載

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