本章將從 Minimal Language 專案範本出發,逐步建構狀態機 DSL 的核心領域模型:根模型 StateMachine、狀態 State、轉移關係 Transition、動作 Action 及其繼承階層 EntryAction/ExitAction,並引入自訂列舉 StateKind 區分初始/一般/結束狀態,完整示範 DSL 定義、模板轉換與程式碼生成驗證流程。
DslDefinition.dsl。ExampleModel → StateMachine,關係 ExampleModelHasElements 自動更名為 StateMachineHasElements。Elements 的 Property Name 為 States (注意非 Name),關係自動更新為 StateMachineHasStates。StateMachine 的 Name 為 State。ExampleElement → State。
提示:Property Name (屬性名) 決定導覽屬性名稱;Name (域角色名) 用於模型內部識別,兩者用途不同。
StateReferencesTargets 即為狀態間引用關係,重命名為 Transition。Targets 端:Property Name = Successors、Name = Predecessor。Sources 端:Property Name = Predecessors、Name = Successor。
右鍵 Transition → Add Domain Property,新增四個 string 型別屬性:
Event (事件)Condition (守衛條件)Action (動作)Label (標籤)此即構成狀態機元資料核心:事件、條件、動作。
LanguageSm 右鍵 → Add Domain Enumeration,命名 StateKind。Normal=0、Initial=1、Final=2。State 新增屬性 Kind,型別選擇 StateKind。
需求:狀態可包含多個進入/退出動作,動作屬於狀態 (嵌入關係)。但 DSL 限制:同一父類不能對同一子類建立多個嵌入關係 (會導致歧義)。解決方案:領域類繼承。
Action,屬性:Label、Code (皆 string)。EntryAction、ExitAction (無額外屬性)。EntryAction 再點 Action;同理 ExitAction 繼承 Action。

State 指向 EntryAction (Multiplicity: 0..* / 1..1);同理 State → ExitAction。表示一個狀態可擁有零或多個進入/退出動作,每個動作隸屬單一狀態。完成的 DSL 元資料模型全貌:

DomainClasses.cs 類別圖,確認域類、關係、繼承、屬性均正確映射:
出處:https://lonely7345.cnblogs.com/
本文配套原始碼下載