共用方式為


覆寫和延伸產生的類別

將您的 DSL 定義做為一個平台,供您建置一組以特定領域語言為基礎的強大工具。 您可覆寫及擴充從 DSL 定義產生的類別來建立許多擴充和調整。 這些類別不僅包含您在 DSL 定義圖表中明確定義的領域類別,也包含定義工具箱、總管、序列化等的其他類別。

擴充性機制

提供數種機制讓您可擴充產生的程式碼。

覆寫部分類別中的方法

部分類別定義允許在多個位置中定義類別。 這可讓您將產生的程式碼與您自行撰寫的程式碼分隔。 在手動撰寫的程式碼中,您可以覆寫產生的程式碼所繼承的類別。

例如,如果您在 DSL 定義中定義名為 Book 的領域類別,您可以撰寫可新增覆寫方法的自訂程式碼:

public partial class Book
{
   protected override void OnDeleting()
   {
      MessageBox.Show("Deleting book " + this.Title);
      base.OnDeleting();
   }
}

注意

若要覆寫所產生類別中的方法,請一律在與所產生檔案分隔的檔案中撰寫程式碼。 一般而言,檔案會包含在名為 CustomCode 的資料夾中。 如果您變更產生的程式碼,當您從 DSL 定義重新產生程式碼時,程式碼將會遺失。

若要探索您可以覆寫的方法,請在類別中輸入覆寫,後面接著空格。 IntelliSense 工具提示會告訴您可以覆寫哪些方法。

雙衍生類別

產生的類別中大部分方法都是繼承自模型命名空間中的一組固定類別。 不過,會在產生的程式碼中定義某些方法。 通常,這表示您無法覆寫這些方法;您無法在某個部分類別中覆寫相同類別的另一個部分定義中所定義的方法。

不過,您可以設定領域類別的 Generates Double Derived 旗標來覆寫這些方法。 這會導致產生兩個類別,一個是另一個的抽象基底類別。 所有方法和屬性定義都在基底類別中,且只有建構函式位於衍生類別中。

例如,在範例 Library.dsl 中,CirculationBook 領域類別的 Generates``Double Derived 屬性已設定為 true。 該領域類別產生的程式碼包含兩個類別:

  • CirculationBookBase,這是抽象的,其中包含所有方法和屬性。

  • CirculationBook,衍生自 CirculationBookBase。 這是空的,但其建構函式除外。

若要覆寫任何方法,您可以建立衍生類別的部分定義,例如 CirculationBook。 您可以覆寫產生的方法和繼承自模型架構的方法。

您可以使用此方法搭配所有類型的元素,包括模型元素、關聯性、圖形、圖表和連接器。 您也可以覆寫其他所產生類別的方法。 某些產生的類別 (例如 ToolboxHelper) 一律是雙重衍生的。

自訂建構函式

您無法覆寫建構函式。 即使在雙衍生類別中,建構函式也必須位於衍生類別中。

如果您要提供自己的建構函式,可在 DSL 定義中針對領域類別設定 Has Custom Constructor 來執行此動作。 當您按一下 [轉換所有範本] 時,產生的程式碼將不會包含該類別的建構函式。 其會包含對遺漏建構函式的呼叫。 當您建置解決方案時,這會導致錯誤報告。 按兩下錯誤報告,以在說明您所應提供的所產生程式碼中檢視註解。

在與產生的檔案分隔的檔案中撰寫部分類別定義,並提供建構函式。

已標幟的擴充點

已標幟的延伸點是 DSL 定義中的位置,您可以在其中設定屬性或核取方塊,以指出您將提供自訂方法。 自訂建構函式是一個範例。 其他範例包括將領域屬性的 Kind 設定為 Calculated 或 Custom Storage,或在連線建立器中設定 Is Custom 旗標。

在每個案例中,當您設定旗標並重新產生程式碼時,將會產生建置錯誤。 按兩下錯誤,以檢視說明您必須提供內容的註解。

規則

交易管理員可讓您定義在發生指定事件的交易 (例如屬性中的變更) 結束之前所執行的規則。 規則通常用來維護存放區中不同元素之間的同步處理。 例如,規則是用來確保圖表顯示模型的目前狀態。

規則是以每個類別為基礎進行定義,因此您不必讓程式碼為每個物件註冊規則。 如需詳細資訊,請參閱 規則在模型內傳播變更

存放區事件

模型存放區提供事件機制,可讓您用來接聽存放區中特定類型的變更,包括新增及刪除元素、屬性值變更等等。 會在進行變更的交易關閉之後呼叫事件處理常式。 這些事件通常用來更新存放區外部的資源。

.NET 事件

您可以訂閱圖形上的某些事件。 例如,您可以接聽圖形上的滑鼠點擊。 您必須撰寫訂閱每個物件事件的程式碼。 此程式碼可以撰寫在 InitializeInstanceResources() 的覆寫中。

有些事件會在 ShapeFields 上產生,用來繪製圖形上的裝飾項目。 如需範例,請參閱做法:攔截圖形或裝飾項目上的點選

這些事件通常不會發生在交易內部。 如果您要在存放區中進行變更,則應該建立交易。