您的 DSL 定義是一個平台,您可以在其上建置一組以網域特定語言為基礎的強大工具。 透過置換和擴充從 DSL 定義產生的類別,可以進行許多延伸和調整。 這些類別不僅包括您在 DSL 定義圖表中明確定義的網域類別,還包括定義工具箱、總管、序列化等的其他類別。
擴充性機制
提供數種機制,可讓您擴充產生的程式碼。
覆寫部分類別中的方法
部分類別定義允許在多個位置定義類別。 這可讓您將產生的程式碼與您自己編寫的程式碼分開。 在手動撰寫的程式碼中,您可以覆寫生成程式碼所繼承的類別。
例如,如果您在 DSL 定義中定義名為 的網域類別 Book,您可以撰寫自訂程式碼來新增覆寫方法:
public partial class Book
{
protected override void OnDeleting()
{
MessageBox.Show("Deleting book " + this.Title);
base.OnDeleting();
}
}
備註
若要覆寫產生類別中的方法,請一律將程式碼寫入與產生檔案分開的檔案中。 一般而言,檔案會包含在名為 CustomCode 的資料夾中。 如果您對產生的程式碼進行變更,當您從 DSL 定義重新產生程式碼時,它們將會遺失。
若要探索您可以覆寫哪些方法,請在類別中鍵入 override ,後面接著空格。 IntelliSense 工具提示會告訴您可以覆寫哪些方法。
Double-Derived 類別
產生類別中的大部分方法都是繼承自 Modeling 命名空間中的一組固定類別。 不過,有些方法會在產生的程式碼中定義。 通常,這表示您無法覆寫它們;您無法在一個部分類別中置換相同類別的另一個部分定義中定義的方法。
不過,您可以藉由設定網域類別的 [產生雙重衍生 ] 旗標來覆寫這些方法。 這會導致產生兩個類別,一個是另一個類別的抽象基類。 所有方法和屬性定義都在基類中,只有建構函式在衍生類別中。
例如,在範例 Library.dsl 中, CirculationBook 網域類別的屬性 Generates``Double Derived 設定為 true。 該網域類別產生的程式碼包含兩個類別:
CirculationBookBase,這是一個抽象,包含所有方法和屬性。CirculationBook,源自CirculationBookBase。 除了它的構造函數之外,它是空的。
若要置換任何方法,您可以建立衍生類別的部分定義,例如 CirculationBook。 您可以覆寫產生的方法,以及繼承自建模架構的方法。
您可以將此方法用於所有類型的元素,包括模型元素、關聯性、圖形、圖表和連接器。 您也可以置換其他產生類別的方法。 某些產生的類別,例如 ToolboxHelper 一律是雙重衍生的。
自訂建構函式
您無法重寫建構函式。 即使在雙派生類別中,建構函式也必須位於衍生類別中。
如果您想要提供自己的建構函式,可以透過在 DSL 定義中設定 Has Custom Constructor 網域類別來執行此動作。 當您按一下 [轉換所有範本] 時,產生的程式碼將不包含該類別的建構函式。 它將包含對遺漏的建構函式進行呼叫。 這會導致在您建置解決方案時產生錯誤報告。 按兩下錯誤報告,即可在產生的程式碼中查看註解,說明您應該提供的內容。
在與產生的檔案分開的檔案中撰寫部分類別定義,並提供建構函式。
標記的延伸點
標幟延伸點是 DSL 定義中的一個位置,您可以在其中設定屬性或核取方塊,以指出您將提供自訂方法。 自訂建構函式就是一個例子。 其他範例包括將網域屬性的 設定 Kind 為 [計算] 或 [自訂儲存體],或在連線產生器中設定 [是自訂] 旗標。
在每種情況下,當您設定旗標並重新產生程式碼時,都會導致建置錯誤。 雙擊錯誤,以查看說明您需要提供內容的註解。
規則
交易管理員可讓您定義因發生指定事件而在交易完成之前執行的規則,例如屬性變更。 規則通常用於維護商店中不同元素之間的同步性。 例如,規則可用來確保圖表顯示模型的目前狀態。
規則是以每個類別為基礎定義,因此您不需要有程式碼來註冊每個物件的規則。 如需詳細資訊,請參閱 規則在 模型內傳播變更。
店家活動
建模存放區提供事件機制,可用來接聽存放區中特定類型的變更,包括新增和刪除元素、屬性值的變更等等。 事件處理常式會在發生變更的交易關閉之後呼叫。 一般而言,這些事件會用來更新存放區外部的資源。
.NET 事件
您可以訂閱圖形上的某些事件。 例如,您可以監聽滑鼠點擊圖形。 您必須撰寫程式碼來監聽每個物件的事件。 此程式碼可以以 InitializeInstanceResources() 的覆寫方式撰寫。
某些事件是在 ShapeFields 上產生的,用於在圖形上繪製裝飾器。 如需範例,請參閱 如何:攔截圖形或修飾器的按鍵操作。
這些事件通常不會發生在交易內。 如果您想在商店中進行更改,您應該創建交易。