共用方式為


了解模型、類別和關係

網域特定語言 (DSL) 是由其 DSL 定義檔,以及您可能撰寫的任何自訂程式代碼所定義。 DSL 解決方案中的大部分程式代碼都是從此檔案產生的。

本主題說明 DSL 定義的核心特性。

DSL 定義

當您開啟 Dsl\DslDefinition.dsl時,您的 Visual Studio 視窗類似下圖。

DSL 設計工具

DSL 定義中最重要的資訊會顯示在 DSL 定義圖中。 其他資訊也是 DslDefinition.dsl 的一部分,會顯示在 DSL Explorer 中,通常出現在圖表的一側。 您可以使用圖表來執行最頻繁的工作,並使用 DSL Explorer 來進行更進階的自訂。

DSL 定義圖顯示定義模型元素的網域類別,以及定義模型元素之間鏈結的關係。 它還顯示用於向使用者顯示模型元素的形狀和連接器。

DSL 設計器與泳道

當您在 DSL 定義中選取項目時,無論是在圖表上還是在 DSL 總管中,該項目的相關資訊都會顯示在 [內容] 視窗中。 其他資訊可能會顯示在 DSL 詳細資料視窗中。

模型是 DSL 的實例

模型是由使用者建立的 DSL 實例。 模型包含模型元素 (您定義之網域類別的實例) ,以及元素之間的鏈結 (您定義之網域關係的實例)。 模型也可以有圖形和連接器,在圖表上顯示模型元素和連結。 DSL 定義包括圖形類別、連接器類別,以及圖表的類別。

DSL 定義也稱為 網域模型。 DSL 定義或領域模型是領域特定語言的設計階段表示法,而模型是領域特定語言的運行時間具現化。

領域類別定義模型元素

網域類別用於建立網域中的各種元素,而網域關係是元素之間的連結。 它們是元素和連結的設計階段表示法,這些元素和連結將由設計特定語言的使用者在建立模型時具現化。

此圖顯示音樂庫 DSL 使用者所建立的模型。 音樂專輯由包含歌曲列表的框表示。 藝術家以圓角方框表示,並與他們曾參與製作的專輯相連。

產生的 DSL 實例模型

DSL 定義將兩個面向分開。 模型圖上模型元素的外觀是使用圖形類別和連接器類別來定義的。 模型中攜帶的資訊是使用網域類別和網域關係來定義的。

下圖顯示音樂庫 DSL 定義中的網域類別和關聯性。

內嵌和參照關係

圖中顯示四個網域類別:音樂、專輯、藝術家和歌曲。 網域類別會定義網域屬性,例如 Name、Title 等。 在實例模型中,其中一些內容的值會顯示在圖表上。

類別之間是網域關聯性:MusicHasAlbums、MusicHasArtists、AlbumbHasSongs 和 ArtistAppearedOnAlbums。 這些關係具有多重性,例如 1..1、0..*。 例如,每首歌曲都必須透過 AlbumHasSongs 關係與唯一一個專輯相關。 每張專輯可以有任意數量的歌曲。

重新排列 DSL 定義圖

請注意,網域類別可以在 DSL 定義圖表上出現數次,就像此圖中的 Album 一樣。 一律有一個主視圖,並且可以有一些 參考 視圖。

若要重新排列 DSL 定義圖表,您可以:

  • 使用 「將樹帶到這裡 」和 「分割樹狀結構 」指令來交換主視圖和參考視圖。 以滑鼠右鍵按一下單一網域類別,以查看這些命令。

  • 按 Ctrl+Up 和 Ctrl+Down 來重新排序網域類別和圖形類別。

  • 使用每個圖形右上角的圖示收合或展開類別。

  • 按一下網域類別底部的減號 (-) 來收合樹狀結構的部分。

遺產

可以使用繼承來定義網域類別。 若要建立繼承衍生,請按一下 [繼承] 工具,按一下衍生類別,然後按一下基底類別。 模型元素具有在其自己的網域類別上定義的所有內容,以及繼承自基底類別的所有內容。 它還繼承了它在人際關係中的角色。

繼承也可以在關係、圖形和連接器之間使用。 繼承必須限制在同一群組內。 圖形無法繼承自領域類別。

網域關係

模型元素可以透過關係連結。 連結一律是二進位的;它們恰好連結了兩個元素。 然而,任何元素都可以有許多指向其他物件的鏈接,甚至同一對元素之間可以有多個連結。

就像您可以定義不同類別的元素一樣,您可以定義不同類別的連結。 連結的類別稱為 網域關係。 網域關係會指定其實例可以連接哪些元素類別。 關係的每一端都稱為 角色,而網域關係會定義兩個角色的名稱,以及關係本身的名稱。

網域關係有兩種:內嵌關係和參照關係。 在 DSL 定義圖表上,內嵌關聯性在每個角色處都有實線,而參照關聯性則有虛線。

嵌入關係

模型中的每個元素 (除了其根) 都是一個內嵌連結的目標。 因此,整個模型形成了一棵嵌入鏈接樹。 內嵌關係代表包含或擁有權。 以這種方式相關的兩個模型元素也稱為父元素和子元素。 據說孩子嵌入了父母體內。

內嵌連結通常不會在圖表上明確顯示為連接器。 相反,它們通常以遏制來表示。 模型的根由圖表表示,其中嵌入的元素在圖表上顯示為形狀。

在此範例中,根類別 Music 與 Album 之間具有嵌入關係 MusicHasAlbums,而 Album 與 Song 之間則具有嵌入關係 AlbumHasSongs。 每個專輯內的列表中,歌曲會顯示成項目。 Music 也將 MusicHasArtists 內嵌至 Artist 類別,其實例也會在圖表上顯示為圖形。

依預設,當內嵌元素的父項被刪除時,會自動刪除。

當模型以 XML 格式儲存至檔案時,內嵌元素會巢狀在其父項內,除非您已自訂序列化。

備註

嵌入與繼承不同。 內嵌關係中的子系不會繼承父系的屬性。 內嵌是模型元素之間的一種連結類型。 繼承是類別之間的關係,不會在模型元素之間建立連結。

嵌入規則

實例模型中的每個元素都必須是一個內嵌連結的目標,但模型的根目錄除外。

因此,除了根類別之外,每個非抽象網域類別都必須是至少一個內嵌關係的目標,或者它必須從基類繼承內嵌。 一個類別可以是多個嵌入的目標,但其實例模型元素一次只能有一個父項。 從目標到來源的多重性必須是 0..1 或 1..1。

探險器顯示內嵌樹狀結構

您的 DSL 定義也會建立一個探索器,使用者會在其模型圖旁邊看到該探索器。

產生的 DSL 瀏覽器

資源管理器會顯示模型中的所有元素,甚至是您尚未定義形狀的元素。 它顯示元素和內嵌關係,但不顯示參考關係。

若要查看元素的網域內容值,使用者會在模型圖表或模型總管中選取元素,然後開啟 [內容] 視窗。 它會顯示所有網域屬性,包括未顯示在圖表上的屬性。 在此範例中,每首歌曲都有標題和類型,但圖表上只顯示標題的值。

參考關係

參考關係代表任何種類的未內嵌關係。

參考關聯性通常會在圖表上顯示為圖形之間的連接器。

在模型的 XML 表示法中,兩個元素之間的參考連結會使用 名字名稱 來表示。也就是說,名字名稱是唯一識別模型中每個元素的名稱。 每個模型元素的 XML 節點都包含指定關係名稱及其他元素標誌的節點。

角色

每個網域關係都有兩個角色:來源角色和目標角色。

在下圖中, Publisher 網域類別與 PublisherCatalog 網域關聯性之間的線條是來源角色。 網域關係與 相簿 網域類別之間的線是目標角色。

角色和屬性。

當您撰寫遍歷模型的程式碼時,與關聯性相關聯的名稱特別重要。 例如,當您建置 DSL 解決方案時,產生的類別 Publisher 具有屬性 Catalog,該屬性是 Albums 的集合。 類別 Album 具有屬性 Publisher,該屬性是類別 Publisher 的單一實例。

當您在 DSL 定義中建立關係時,會提供屬性和關係名稱預設值。 但是,您可以更改它們。

多重性

多重性指定在網域關係中可以具有相同角色的元素數目。 在此範例中,目錄角色的零對多(0..*)多重性設定說明,Publisher領域類別的任何實例都可以擁有您希望的任意數量的PublisherCatalog關聯連結。

在圖表上鍵入或修改 Multiplicity[內容] 視窗中的屬性,以設定角色的多重性。 下表說明此屬性的設定。

多重性類型 Description
0..* (零到多) 網域類別的每一個實例可以有多個關係實例,也可以沒有關係實例。
0..1 (零到一) 網域類別的每一個實例都不能有多個關係實例,或沒有關係實例。
1..1 (一) 網域類別的每個實例都可以有一個關聯性實例。 您無法從角色類別的任何實例建立此關係的多個實例。 如果啟用了驗證,當角色類別的任何實例沒有對應的關聯性實例時,將會出現驗證錯誤訊息。
1..* (一對多) 具有此多重性的角色上類別的每個實例都可以有多個關聯性實例,而且每個實例必須至少有一個關聯性實例。 如果啟用驗證,當角色類別的任何實例沒有任何關係的實例時,將出現驗證錯誤。

網域關係作為類別

連結會在 Store 中表示為 LinkElement 的實例,這是 ModelElement 的衍生類別。 您可以在網域關係的網域模型圖表中定義這些內容。

您也可以將關係設為其他關係的來源或目標。 在網域模型圖表中,以滑鼠右鍵按一下網域關聯性,然後按一下 [顯示為類別]。 將出現額外的類別框。 然後,您可以將它與關係連結起來。

您可以部分透過繼承來定義關聯性,就像使用網域類別一樣。 選取衍生關係,並在「內容」視窗中設定 「基本關係 」。

衍生關係會特化其基本關係。 它連結的網域類別應該衍生自或與基底關聯性所連結的類別相同。 在模型中建立衍生關係的連結時,它是衍生關係與基本關係的實例。 在程式代碼中,您可以使用基底或衍生類別所產生的屬性,流覽至連結的另一端。