了解模型、類別和關聯性
定義域專屬語言 (DSL) 是由其 DSL 定義檔,加上,您可以撰寫任何自訂的程式碼定義的。 大多數的 DSL 方案中的程式碼會產生從這個檔案。
本主題將說明 DSL 定義的中央的功能。
DSL 定義
當您開啟Dsl\DslDefinition.dsl,您Visual Studio視窗類似下列的圖片。
DSL 定義中最重要的資訊會顯示在 DSL 定義圖表中。 其他資訊,這也是 DslDefinition.dsl 的一部分,會顯示在 DSL 總管] 中,它通常會顯示在圖表的側邊。 您可以處理的最常見的工作,如圖與更進階的自訂設定的 DSL 總管。
DSL 定義圖表顯示定義模型項目,以及定義模型元素間的連結關係的網域類別。 此外,它也會顯示圖案及連接線,用來向使用者顯示的模型項目。
當您在 DSL 定義中,在圖表上或 DSL 總管] 中選取項目相關的資訊會顯示在 [屬性] 視窗中。 可能在 DSL 細節] 視窗中顯示其他資訊。
模型是 Dsl 的執行個體
A 模型是由使用者建立您的 DSL 的執行個體。 模型包含模型項目,也就是您所定義的網域類別和連結項目,也就是您定義網域關聯性的執行個體的執行個體。 圖案及連接線,顯示在圖表的模型項目和連結,也可以有一個模型。 DSL 定義包含圖形類別、 連接器類別,以及用來在圖表的類別。
DSL 定義也就是會網域模型。 DSL 定義或網域的模型是設計階段表示定義域專屬語言的一部分,而模型] 是定義域專屬語言執行階段具現化。
網域類別定義的模型項目
網域類別用來在網域中建立的各種元素,以及網域關聯性的項目之間的連結。 它們是項目,並會具現化設計的特定語言的使用者建立他們的模型時的連結的設計階段表示。
下圖顯示已建立的音樂] 媒體櫃 DSL 使用者模型。 音樂輯,其中包含的歌曲清單來表示。 演出者圓角] 方塊中,原則由,並且已經連接到他們有貢獻的專輯。
DSL 定義用來分隔兩個層面。 使用圖形的類別和連接器類別定義模型圖表上的模型元素的外觀。 此模型中所含的資訊是使用網域類別和網域關係所定義的。
下圖顯示網域類別和關聯性,DSL 定義中的音樂] 媒體櫃。
下圖顯示四個網域類別: 音樂、 專輯、 演出者及歌曲。 網域類別定義網域內容,例如名稱、 標題、 等等。 在該執行個體的模型,其中某些屬性的值會顯示在圖表上。
類別之間是網域關聯性: MusicHasAlbums,MusicHasArtists,AlbumbHasSongs 和 ArtistAppearedOnAlbums。 關聯性有多樣性,例如 1..1,0..*。 比方說,必須與相關透過 AlbumHasSongs 關係的一個專輯每首歌曲。 每個專輯可以有任意數目的歌曲。
重新整理 DSL 定義圖表
請注意網域類別可以出現多次,DSL 定義圖表中,這張圖片專輯一樣。 一定會有一個主要的檢視,而且有一些參考的檢視。
若要重新排列 DSL 定義圖表,您可以:
切換主要和使用參考檢視此處將樹狀目錄 和 分割樹狀結構指令。 若要查看這些命令的單一網域類別上按一下滑鼠右鍵。
藉由按下 Ctrl + 向上鍵和 Ctrl + 向下鍵,重新排列的網域類別和圖形的類別。
摺疊或展開類別在右上方的每個圖形中使用的圖示。
摺疊樹狀結構的部分,即可在網域類別底部的減號 (-)。
繼承
網域類別,可以使用繼承來定義。 若要建立繼承衍生,按一下 [繼承] 工具,按一下 [衍生的類別中,然後按一下基底類別。 模型項目都有它自己的網域類別,加上繼承自基底類別的所有屬性定義的所有屬性。 它也會繼承其關聯性中的角色。
也可以使用繼承,之間的關聯性、 圖形和連接器。 繼承必須保持在相同群組中。 網域類別無法繼承圖形。
網域關聯性
模型項目可由關聯性連結。 連結一律是二進位。 這些連結確實兩個項目。 不過,任何項目可以有許多連結到其他物件,而且更能有相同的組的項目之間的多個連結。
就像您可以定義不同類別的項目,您可以定義不同類別的連結。 連結的類別稱為 「 網域關聯性。 網域關聯性指定何種項目的類別及其執行個體就可以連線。 關聯每一端,會呼叫角色,並且網域關聯性定義的兩個角色,以及本身的關聯性的名稱。
有兩種網域關係: 內嵌關聯性和參考的關聯性。 DSL 定義在圖表上內嵌的關聯性有實線在每個角色,而且有虛線的參考關聯性。
內嵌關聯性
在模型中,除了對其根目錄中,每個項目是一個內嵌連結的目標。 因此,整個模型會形成單一樹狀目錄中的內嵌連結。 內嵌的關聯性所代表的內含項目或擁有權。 以這種方式與相關的兩個模型元素也是父系和子系。 子即稱為內嵌在父代。
內嵌的連結不會通常顯示明確地為在圖表上的連接器。 相反地,它們通常是由表示內含項目。 模型的根由圖表中,並內嵌在它的元件會顯示成圖表上的圖案。
在範例中,根類別音樂有內嵌的關聯性專輯、 具有內嵌的 AlbumHasSongs 歌曲的 MusicHasAlbums。 歌曲會顯示成每個專輯內的清單中的項目。 音樂也會有內嵌的 MusicHasArtists 演出者類別,其執行個體也會顯示為在圖表上的圖案。
預設情況下,內嵌項目時會自動刪除其父代會被刪除。
當儲存模型檔案以 XML 格式,內嵌項目會在巢狀其父代,除非您已經自訂序列化。
注意事項 |
---|
內嵌不繼承相同。在內嵌的關聯性的子系不會繼承父項的屬性。內嵌是連結的一種模型元素間。繼承類別,之間的關係並不會建立模型元素間的連結。 |
內嵌的規則
每個執行個體模型中的項目必須是一個內嵌連結,除了模型的根目標。
因此,除了根類別中的每個非抽象網域類別必須至少一個內嵌的關聯性,目標,或必須繼承自基底類別的內嵌。 類別可以作為目標的兩個或多個內嵌,但其執行個體的模型項目一次只能有一個父代。 從目標多重性來源必須..1 或 1..1。
[檔案總管] 會顯示內嵌的樹狀目錄
您的 DSL 定義也會建立檔案總管],使用者會看到其模型圖的旁邊。
[檔案總管] 會顯示所有項目,在模型中,即使您未定義的所有圖案群組。 它會顯示項目和內嵌的關係,但是未參考的關聯性。
若要查看項目的網域屬性的值,使用者可選取項目,模型圖表中或在模型總管] 中並會開啟 [屬性] 視窗。 它會顯示所有網域屬性,包括那些不會顯示在圖表上。 在這個範例中,每首歌曲都有一個標題和內容類型,但在圖表中顯示標題的值。
參考的關聯性
參考的關聯性代表任何一種非內嵌的關聯性。
參考的關聯性通常會在圖表上以圖形之間的連接器。
此模型的 XML 表示,在兩個元素之間的參考連結都表示使用 moniker。 也就是對 moniker 都是唯一識別每個項目模型中的名稱。 每個模型元素的 XML 節點會包含指定的關聯性的名稱和其他項目的 moniker 的節點。
角色
每個網域關聯性有兩個角色、 來源角色和目標角色。
下圖中,在 「 發行者 」 的網域類別之間的 PublisherCatalog 網域關聯性線條會是來源角色。 網域關聯性和相簿的網域類別之間的線條會在目標角色。
當您撰寫程式碼,以周遊模型相關聯的關聯性的名稱就格外重要了。 比方說,當您建置 DSL 方案時,「 發行者 」 產生的類別都具有屬性是集合的相簿的類別目錄。 專輯的類別都具有屬性類別的 「 發行者 」 的單一執行個體的 「 發行者 」。
當您建立關聯性在 DSL 定義時,屬性和關聯性名稱會提供預設值。 不過,您可以變更它們。
多樣性
多樣性指定多少項目可以在網域關聯性上有相同的角色。 在範例中,若要多零 (0..*) 類別目錄的角色中的 [多重性] 設定會指定屬於 「 發行者 」 的網域類別的執行個體都可以有多個 PublisherCatalog 關聯性連結,當您要指定給它。
設定角色的重數,只要在圖表上,或藉由修改Multiplicity屬性在屬性視窗。 下表說明這個屬性的設定。
重數的型別 |
描述 |
---|---|
0..* (0 到很多) |
每個網域類別執行個體可以擁有關聯性的多重執行個體或關聯性的任何實例。 |
..1 (一個為零) |
每個網域類別執行個體可以擁有關聯性的最多只能有一個執行個體或關聯性的任何實例。 |
(1) 1..1 |
每個網域類別執行個體可以有一個執行個體的關聯性。 您無法建立此關係的多個執行個體與角色類別的任何執行個體。 如果啟用了驗證,角色類別的任何執行個體都具有關聯性的任何執行個體,就會顯示驗證錯誤。 |
1..* (一對多) |
每個執行個體上沒有角色,此多樣性的類別可以有多個執行個體的關聯性,而且每個執行個體必須具有關聯性至少一個執行個體。 如果啟用了驗證,角色類別的任何執行個體都具有關聯性的任何執行個體,就會顯示驗證錯誤。 |
類別為網域關聯性
連結被表示為 LinkElement,也就是 ModelElement 的衍生的類別的執行個體存放區中。 您可以定義這些屬性在網域關係的網域模型圖表中。
[來源] 或 [其他的關聯性的目標,您也可以將關聯性。 在網域模型圖表中,以滑鼠右鍵按一下網域關聯性,然後按一下顯示類別。 其他的類別] 方塊中會出現。 然後,就可以對其連接的關係。
您可以定義關聯性有一部分要靠繼承,就如同您可以透過網域類別。 選取衍生關聯性,並將基底關聯性 [屬性] 視窗中。
在衍生的關聯性會指定其基底的關聯性。 網域類別必須衍生自的連結,以致或為同一類別的基底的關聯性來連結。 在模型建立衍生的關聯性的連結時,它是衍生和基底的關聯性的執行個體。 在程式碼中,您可以瀏覽的連結,使用屬性產生基底或衍生類別的另一端。