本主題說明定義和使用使用 Visual Studio 模型化 SDK 建立的網域特定語言 (DSL) 的基本概念。
備註
當您安裝 Visual Studio 的特定功能時,會自動安裝文字範本轉換 SDK 和 Visual Studio 模型 SDK。 如需詳細資訊,請參閱 此部落格文章。
如果您是 DSL 的新手,建議您瀏覽 DSL 工具實驗室,您可以在此網站中找到該實驗室: 視覺化和建模 SDK
您可以使用 Domain-Specific 語言做什麼?
領域特定語言是一種符號,通常是圖形的,旨在用於特定目的。 相比之下,UML 等語言是通用的。 在 DSL 中,您可以定義模型元素的類型及其關係,以及它們在畫面上的呈現方式。
當您設計完 DSL 後,您可以將其作為 Visual Studio 擴充套件 (VSIX) 套件的一部分發行。 使用者在 Visual Studio 中使用 DSL:
該符號只是 DSL 的一部分。 除了符號之外,您的 VSIX 套件還包含使用者可以套用的工具,以協助他們從模型編輯和產生材料。
DSL 的主要應用之一是產生程式代碼、配置文件和其他工件。 特別是在大型專案和產品線中,將建立產品的多個變體,從 DSL 產生許多可變方面可以大幅提高可靠性並非常快速地回應需求變更。
本概觀的其餘部分是逐步解說,介紹在 Visual Studio 中建立和使用網域特定語言的基本作業。
先決條件
若要定義 DSL,您必須已安裝下列元件:
| 元件 | Link |
|---|---|
| Visual Studio | http://go.microsoft.com/fwlink/?LinkId=185579 |
| Visual Studio SDK | https://go.microsoft.com/fwlink/?linkid=2166172 |
| 適用於 Visual Studio 的模型化 SDK |
備註
文字範本轉換元件會自動安裝為 Visual Studio 延伸模組開發工作負載的一部分。 您也可以從 Visual Studio 安裝程式的 [個別元件] 索引標籤在 [SDK、程式庫和架構] 類別下安裝它。 從 個別元件 索引標籤安裝 Modeling SDK 元件。
建立 DSL 解決方案
若要建立新的網域特定語言,您可以使用 Domain-Specific 語言專案範本來建立新的 Visual Studio 解決方案。
在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。
在 專案類型下,展開 其他專案類型節點 ,然後按一下擴充 性。
按一下 領域專用語言設計工具。
在 「名稱 」方塊中,輸入 FamilyTree。 按一下 [確定]。
Domain-Specific 語言精靈隨即開啟,並顯示範本 DSL 解決方案的清單。
按一下每個範本即可查看描述,
模板是有用的起點。 每一個都提供了一個完整且可運行的 DSL,您可以根據需要進行編輯。 通常,您會選擇最接近您要創建的模板。
在此操作說明中,請選擇 Minimal Language 範本。
在適當的精靈頁面中輸入 DSL 的副檔名。 這是包含您的 DSL 實例的檔案將會使用的檔案副檔名。
選擇未與您電腦或任何您要安裝DSL的電腦中的應用程式關聯的擴充套件。 例如, docx 和 htm 是不可接受的副檔名。
如果您輸入的擴展名被用作 DSL,嚮導將警告您。 請考慮使用不同的副檔名。 您也可以重設 Visual Studio SDK 實驗性實例,以清除舊的實驗性設計工具。 在 Windows 的 [ 開始] 功能表中,輸入 reset the Visual Studio,然後執行符合您 Visual Studio 版本的 [重設 Microsoft Visual Studio 實驗實例 ] 命令。
檢查其他頁面,然後按一下 完成。
會產生包含兩個專案的解決方案。 它們會命名為 Dsl 和 DslPackage。 會開啟名為 DslDefinition.dsl 的圖表檔案。
備註
您可以在兩個專案的資料夾中看到的大部分程式碼都是從 DslDefinition.dsl 產生。 因此,對 DSL 的大多數修改都是在此檔案中進行的。
使用者介面現在類似下圖。
此解決方案定義了領域特定語言。 如需詳細資訊,請參閱 Domain-Specific 語言工具使用者介面概觀。
DSL 解決方案的重要部分
請注意新解決方案的以下方面:
Dsl\DslDefinition.dsl 這是您在建立 DSL 解決方案時看到的檔案。 解決方案中的幾乎所有程式碼都是從此檔案產生,而且您對 DSL 定義所做的大部分變更都會在這裡進行。 如需詳細資訊,請參閱使用 DSL 定義圖。
Dsl 專案 此專案包含定義網域特定語言的程式碼。
DslPackage 專案 此專案包含允許在 Visual Studio 中開啟和編輯 DSL 實例的程式碼。
執行 DSL
您可以在建立 DSL 解決方案後立即執行它。 稍後,您可以逐步修改 DSL 定義,並在每次變更之後再次執行解決方案。
嘗試使用 DSL 進行實驗
按一下 [方案總管] 工具列中的 [轉換所有範本]。 這會從 DslDefinition.dsl 重新產生大部分的原始程式碼。
備註
每當您變更 DslDefinition.dsl 時,您必須先按一下 [轉換所有範本] ,才能重建解決方案。 您可以自動執行此步驟。 如需詳細資訊,請參閱 如何自動轉換所有範本。
按 F5,或在 [偵錯] 功能表上,按一下 [開始偵錯]。
DSL 會建置並安裝在 Visual Studio 的實驗性實例中。
Visual Studio 的實驗性實例隨即啟動。 實驗性實例會從註冊表中的獨立子樹取得其設定,其中註冊了用於偵錯的 Visual Studio 擴充功能。 Visual Studio 的一般實例無法存取在那裡註冊的延伸模組。
在 Visual Studio 的實驗實例中,從方案總管開啟名為 Test 的模型檔案。
- 或 -
以滑鼠右鍵按一下 [偵錯] 專案,指向 [新增],然後按一下 [項目]。 在 [ 新增項目 ] 對話方塊中,選取 DSL 的檔案類型。
模型檔案會以空白圖表開啟。
工具箱隨即開啟,並顯示適合圖表類型的工具。
使用工具在圖表上建立圖形和連接器。
若要建立形狀,請從「範例形狀」工具拖曳到圖表上。
若要連接兩個圖形,請按一下 [範例連接器] 工具,按一下第一個圖形,然後按一下第二個圖形。
按一下形狀的標籤以變更它們。
您的實驗性 Visual Studio 會類似下列範例:
模型的內容
作為 DSL 實例的檔案內容稱為 模型。 模型包含 模型元素 和元素之間的 連結 。 DSL 定義會指定模型中可以存在哪些類型的模型元素和鏈結。 例如,在從「最小語言」範本建立的 DSL 中,有一種類型的模型元素和一種類型的連結。
DSL 定義可以指定模型在圖表上的顯示方式。 您可以從各種樣式的形狀和連接器中進行選擇。 您可以指定某些形狀出現在其他形狀內。
您可以在編輯模型時,在 「瀏覽器」 視圖中將模型檢視為樹狀結構。 當您將圖形新增至圖表時,模型元素也會顯示在瀏覽器中。 即使沒有圖表也可以使用資源管理器。
如果您在 Visual Studio 的偵錯執行個體中看不到 [Explorer],請在 [檢視] 功能表上指向 [其他視窗],然後按一下 [<您的語言>Explorer]。
DSL 的 API
您的 DSL 會產生一個 API,可讓您讀取和更新作為 DSL 實例的模型。 API 的一個應用是從模型生成文本文件。 如需詳細資訊,請參閱 使用 T4 文字範本進行設計階段程式碼產生。
在偵錯解決方案中,開啟副檔名為「.tt」的範本檔案。 這些範例示範如何從模型產生文字,並允許您測試 DSL 的 API。 其中一個範例是用 Visual Basic 編寫的,另一個是用 Visual C# 編寫的。
每個範本檔案下方都是它產生的檔案。 在 [方案總管] 中展開範本檔案,然後開啟產生的檔案。
範本檔案包含一小段程式碼,其中列出模型中的所有元素。
產生的檔案包含結果。
當您變更模型檔案時,您會在重新產生檔案後看到產生的檔案中對應的變更。
變更模型檔後重新產生文字檔
在 Visual Studio 的實驗實例中,儲存模型檔案。
請確定每個 .tt 檔案中的檔案名稱參數都是您用於實驗的模型檔案。 儲存 .tt 檔案。
按一下 [方案總管] 工具列中的 [轉換所有範本]。
- 或 -
以滑鼠右鍵按一下您要重新產生的範本,然後按一下執行自訂工具。
您可以將任意數量的文字範本檔案新增至專案。 每個範本都會產生一個結果檔案。
備註
當您變更 DSL 定義時,範例文字範本程式碼將無法運作,除非您更新它。
如需詳細資訊,請參閱 從 Domain-Specific 語言產生程式碼 和 撰寫程式碼以自訂 Domain-Specific 語言。
自訂 DSL
當您想要修改 DSL 定義時,請關閉實驗性實例,並更新主要 Visual Studio 實例中的定義。
備註
修改 DSL 定義之後,您可能會遺失使用舊版所建立的測試模型中的資訊。 例如,偵錯解決方案包含名為 Sample 的檔案,其中包含一些圖形和連接器。 開始開發 DSL 定義之後,它們將不可見,而且當您儲存檔案時,它們會遺失。
您可以對 DSL 進行各種擴展。 以下示例將讓您對可能性有一個印象。
每次變更之後,請儲存 DSL 定義,按兩下 [方案總管] 中的 [轉換所有範本],然後按 F5 來試驗變更的 DSL。
重新命名類型和工具
重新命名現有的網域類別和關係。 例如,從「最小語言」範本建立的 Dsl 定義開始,您可以執行下列重新命名作業,讓 DSL 代表家譜。
重新命名網域類別、關聯性和工具
在 DslDefinition 圖表中,將 ExampleModel 重新命名為 FamilyTreeModel,將 ExampleElement 重新命名為 Person,將 Targets 重新命名為 Parents,並將 Sources 重新命名為 Children。 您可以按一下每個標籤來變更它。
重新命名元素和連接器工具。
按一下 [方案總管] 底下的索引標籤,開啟 [DSL 總管] 視窗。 如果您看不到它,請在 [檢視] 功能表上指向 [其他視窗],然後按一下 [DSL 檔案總管]。 只有在 DSL 定義圖是作用中視窗時,DSL Explorer 才會顯示。
開啟 [屬性] 視窗並放置它,以便您可以同時看到 DSL 檔案總管和屬性。
在 DSL 總管中,展開編輯器、工具箱索引標籤、<您的 DSL>,然後展開工具。
按一下 ExampleElement。 這是用來建立元素的工具箱項目。
在 [屬性] 視窗中,將 [名稱 ] 屬性變更為 [人員]。
請注意, Caption 屬性也會變更。
以同樣的方式,將 ExampleConnector 工具的名稱變更為 ParentLink。 變更 Caption 屬性,使其不是 Name 屬性的複本。 例如,輸入 父連結。
重建 DSL。
儲存 DSL 定義檔案。
按一下 [方案總管] 工具列中的 [轉換所有範本]
按 F5。 等到 Visual Studio 的實驗實例出現為止。
在 Visual Studio 實驗實例的偵錯解決方案中,開啟測試模型檔案。 從工具箱中將元素拖曳到其上。 請注意,DSL Explorer 中的工具標題和類型名稱已變更。
儲存模型檔案。
開啟 .tt 檔案,並用新名稱替換舊類型和屬性名稱的所有出現位置。
請確定 .tt 檔案中指定的檔名指定您的測試模型。
儲存 .tt 檔案。 開啟產生的檔案,以查看在 .tt 檔案中執行程式碼的結果。 驗證它是否正確。
將網域屬性新增至類別
將屬性新增至網域類別,例如表示 People 的出生和死亡年份。
若要讓新屬性在圖表上可見,您必須將 裝飾工具 新增至顯示模型元素的圖形。 您也必須將屬性對應至裝飾器。
若要新增屬性並顯示它們
新增屬性。
在 DSL 定義圖中,右鍵按一下 Person 網域類別,指向 新增,然後按一下 網域屬性。
輸入新內容名稱的清單,例如 Birth 和 Death。 在每一項之後按 Enter 鍵。
新增裝飾工具,以在圖形中顯示屬性。
沿著從 Person 網域類別延伸至圖表另一側的灰色線條。 這是圖解元素地圖。 它會將網域類別連結至圖形類別。
以滑鼠右鍵按一下此圖形類別,指向 [新增],然後按一下 [文字裝飾器]。
新增兩個名為 BirthDecorator 和 DeathDecorator 的裝飾器。
選取每個新的裝飾器,然後在 [屬性] 視窗中,設定 [位置] 欄位。 這會決定網域屬性值在圖形上的顯示位置。 例如,設定 InnerBottomLeft 和 InnerBottomRight。
將裝飾器對應至屬性。
開啟 DSL 詳細資料視窗。 它通常位於「輸出」視窗旁邊的標籤中。 如果您看不到它,請在 [ 檢視 ] 功能表上,指向 [ 其他視窗],然後按一下 [DSL 詳細資料]。
在 DSL 定義圖表上,按一下將 Person 領域類別連線至形狀類別的線條。
在 [DSL 詳細資料] 的 [裝飾器對應] 索引標籤上,按一下未對應的裝飾器上的核取方塊。 在 [顯示屬性] 中,選取您要對應的網域屬性。 例如,將 BirthDecorator 對應至 Birth。
儲存 DSL,按一下 [轉換所有範本],然後按 F5。
在範例模型圖表中,確認您現在可以按一下您選擇的位置,並在其中鍵入值。 此外,當您選取 [人員] 圖形時,[屬性] 視窗會顯示新的屬性 [出生] 和 [死亡]。
在 .tt 檔案中,您可以新增取得每個人屬性的程式碼。
定義新類別
您可以將網域類別和關聯性新增至模型。 例如,您可以建立新類別來代表城鎮,並建立新關係來表示一個人住在城鎮中。
若要在模型圖表上使不同的類型不同,您可以將網域類別對映至不同類型的形狀,或對映至具有不同幾何和色彩的形狀。
若要新增和顯示新的網域類別
新增網域類別,並使其成為模型根目錄的子項。
在 [DSL 定義] 圖表中,按一下 [ 內嵌關聯性 ] 工具,按一下根類別 FamilyTreeModel,然後按一下圖表的空白部分。
新的網域類別隨即出現,該類別會以內嵌關係連線至 FamilyTreeModel。
設定其名稱,例如 Town。
備註
除了模型根目錄之外,每個網域類別都必須是至少一個內嵌關係的目標,或者它必須繼承自內嵌目標的類別。 因此,使用內嵌關聯性工具建立網域類別通常很方便。
將網域屬性新增至新類別,例如 Name。
在 Person 和 Town 之間新增參考關係。
按一下 [參考關係 ] 工具,按一下 [人員],然後按一下 [城鎮]。
備註
參考關係表示從模型樹的一個部分到另一個部分的交互參照。
新增圖形以在模型圖表上表示城鎮。
將 幾何圖形從 工具箱拖曳至圖表,然後重新命名,例如 TownShape。
在 [屬性] 視窗中,設定新圖形的 [外觀] 欄位,例如 [填滿色彩] 和 [幾何圖形]。
新增裝飾器以顯示城鎮名稱,並將其重新命名為 NameDecorator。 設定其 Position 屬性。
將 Town 網域類別對應至 TownShape。
按一下 [圖表元素對應 ] 工具,然後按一下 [Town] 網域類別,然後按一下 [TownShape] 圖形類別。
在選取對應連接器的 DSL 詳細資料視窗的 裝飾器地圖 標籤中,勾選 NameDecorator 並將 顯示屬性 設定為 名稱。
建立連接器以顯示 Person 與 Towns 之間的關係。
將連接器從工具箱拖曳至圖表。 重新命名它並設定其外觀屬性。
使用「圖表元素對應」工具,將新連接器連結至「人員」與「城鎮」間的關係。
創建一個用於創建新城鎮的元素工具。
在 DSL Explorer 中,展開 編輯器,然後展開 工具箱標籤。
以滑鼠右鍵按一下 <您的 DSL> ,然後按一下 新增元素工具。
設定新工具的 Name 屬性,並將其 Class 屬性設定為 Town。
設定 [工具箱圖示] 屬性。 按一下 [...] ,然後在 檔案名稱 欄位中,選取圖示檔案。
創建一個連接器工具,用於在城鎮和人民之間建立聯繫。
以滑鼠右鍵按一下 <您的 DSL> ,然後按一下 [新增連接器工具]。
設定新工具的 Name 屬性。
在 ConnectionBuilder 屬性中,選取包含 Person-Town 關係名稱的構建器。
設定 工具箱圖示。
儲存 DSL 定義,按一下 [轉換所有範本],然後按 F5。
在 Visual Studio 的實驗實例中,開啟測試模型檔案。 使用新工具創建城鎮以及城鎮和人之間的聯繫。 請注意,您只能在正確類型的元素之間建立連結。
建立列出每個人居住的城鎮的程式碼。 文字範本是您可以執行此類程式碼的地方之一。 例如,您可以修改偵錯解決方案中的現有 Sample.tt 檔案,使其包含下列程式碼:
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true" #> <#@ output extension=".txt" #> <#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Sample.ftree'" #> <# foreach (Person person in this.FamilyTreeModel.People) { #> <#= person.Name #><#if (person.Town != null) {#> of <#= person.Town.Name #> <#}#> <# foreach (Person child in person.Children) { #> <#= child.Name #> <# } } #>當您儲存 *.tt 檔案時,它會建立一個子公司檔案,其中包含人員及其住所的清單。 如需詳細資訊,請參閱 從 Domain-Specific 語言產生程式碼。
驗證和命令
您可以藉由新增驗證條件約束來進一步開發此 DSL。 這些限制是您可以定義的方法,可確保模型處於正確狀態。 例如,您可以定義限制,以確保孩子的出生日期晚於其父母的出生日期。 如果 DSL 使用者嘗試儲存違反任何限制的模型,驗證功能會顯示警告。 如需詳細資訊,請參閱 Domain-Specific 語言的驗證。
您也可以定義使用者可以呼叫的功能表命令。 指令可以修改模型。 它們也可以與 Visual Studio 中的其他模型以及外部資源互動。 如需詳細資訊,請參閱 如何:修改標準功能表命令。
部署 DSL
若要允許其他使用者使用網域特定語言,您可以散發 Visual Studio 延伸模組 (VSIX) 檔案。 這是在您建置 DSL 解決方案時建立的。
在解決方案的 bin 資料夾中找出 .vsix 檔案。 將其複製到您要安裝它的電腦。 在該電腦上,雙擊 VSIX 檔案。 DSL 可用於該電腦上的所有 Visual Studio 實例。
您可以使用相同的程式在自己的電腦上安裝 DSL,這樣就不需要使用 Visual Studio 的實驗性實例。
如需詳細資訊,請參閱部署 Domain-Specific 語言解決方案。
刪除舊的實驗性 DSL
如果您已建立不再需要的實驗性 DSL,您可以重設 Visual Studio 實驗性實例,從電腦中移除它們。
這會從您的電腦中移除所有實驗性 DSL 和其他實驗性 Visual Studio 延伸模組。 這些是已在偵錯模式下執行的延伸模組。
此程式不會移除已透過執行 VSIX 檔案而完全安裝的 DSL 或其他 Visual Studio 延伸模組。
重設 Visual Studio 實驗實例
在 Windows 的 [ 開始] 功能表中,輸入 reset the Visual Studio,然後執行符合您 Visual Studio 版本的 [重設 Microsoft Visual Studio 實驗實例 ] 命令。
重建您仍想要使用的任何實驗性 DSL 或其他實驗性 Visual Studio 延伸模組。