撰寫程式碼來自訂特定領域語言
本節說明如何使用自訂程式碼,存取、修改或建立特定領域語言 (DSL) 的模型。
撰寫 DSL 程式碼的內容
您可在多種情況下撰寫適用於 DSL 的程式碼:
自訂命令。 您可以建立命令,讓使用者以滑鼠右鍵按一下圖表,並修改模型。 如需詳細資訊,請參閱如何:將命令新增至快捷方式功能表。
驗證。 您可以撰寫程式碼,確認模型處於正確狀態。 如需詳細資訊,請參閱特定領域語言中的驗證。
覆寫預設行為。 您可以修改從 DslDefinition.dsl 所產生程式碼的許多層面。 如需詳細資訊,請參閱覆寫和擴充產生的類別。
文字轉換。 舉例來說,您可以撰寫文字範本,其中包含可存取模型並產生文字檔的程式碼,以用於產生程式碼。 如需詳細資訊,請參閱從特定領域語言產生程式碼。
其他 Visual Studio 延伸模組。 您可以撰寫個別 VSIX 延伸模組來讀取和修改模型。 如需詳細資訊,請參閱如何:在程式碼中開啟檔案的模型
記憶體內部存放區
您在 DslDefinition.dsl 中定義的類別執行個體,會保存在稱為記憶體內部存放區 (IMS) 或存放區的資料結構中。 您在 DSL 中定義的類別一律會採用存放區作為建構函式的引數。 例如,如果您的 DSL 定義名為 Example
的類別:
Example element = new Example (theStore);
將物件保留在存放區中 (而非像一般物件一樣) 提供了幾個好處。
Transactions。 您可以將一系列相關變更分組至異動中:
using (Transaction t = store.TransactionManager.BeginTransaction("updates")) { // make several changes to Store elements here t.Commit(); }
如果變更期間出現例外狀況,導致最終
Commit()
未執行,則存放區會重設為先前的狀態。 此方法可協助您確定錯誤不會讓模型處於不一致的狀態。 如需詳細資訊,請參閱在程式碼中巡覽和更新模型。二進位關聯性。 如果定義兩個類別之間的關聯性,則兩端的執行個體都會有巡覽至另一端的屬性。 兩端一律會同步處理。 例如,如果您以名為 Parents 和 Children 的角色定義父代關聯性,則可以撰寫:
John.Children.Add(Mary)
以下兩個運算式現在為 true:
John.Children.Contains(Mary)
Mary.Parents.Contains(John)
透過撰寫下列內容,也能達到相同效果:
Mary.Parents.Add(John)
如需詳細資訊,請參閱在程式碼中巡覽和更新模型。
規則與事件。 您可以定義在執行指定變更時觸發的規則。 例如,使用規則可讓圖表上的圖形與其呈現的模型元素保持同步。 如需詳細資訊,請參閱回應及傳播變更。
序列化。 存放區提供將其所包含物件序列化至檔案的標準方式。 您可以自訂序列化和還原序列化的規則。 如需詳細資訊,請參閱自訂檔案儲存體和 XML 序列化。