Visual Studio DSL 入門.doc_第1頁
Visual Studio DSL 入門.doc_第2頁
Visual Studio DSL 入門.doc_第3頁
Visual Studio DSL 入門.doc_第4頁
Visual Studio DSL 入門.doc_第5頁
免費預覽已結束,剩余64頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Visual Studio DSL 入門 1 什么是特定領域開發(fā)和DSL 特定領域開發(fā)是用來解決重復發(fā)生的問題的方法,針對每次發(fā)生的問題,通過進行總結和分析,他們之間相同的方面可以一次性的解決而經常變化的方面,可以采用一種特殊的語言表達針對這個特殊語言,我們可以建立模型或者表達式,然后插入到固定部分 對于我們軟件行業(yè)的解決方案來說,固定部分一般采用傳統(tǒng)的設計和實現(xiàn)方式,可以為框架,平臺,解釋器或者編程接口提供可擴展性,具有高度的抽象性和可復用性而特定領域語言專門用來創(chuàng)建變化的部分,從而使整個解決方案可具有可應用性 特定領域語言(DSL,Domain Specific Language)是一種特別用來描述某一專業(yè)領域內涵的描述語言,其實它并不陌生, HTML ,SQL都算的上是DSL的例子 幾種其它DSL MPS /mps/ JetBrains公司的DSL工具,通過這個平臺可以直接定義規(guī)則,生成代碼 MetaEdit+ / 圖形化的DSL工具 Oslo /zh-cn/data/ee460940(en-us).aspx 微軟新推出的圖形化DSL語言,但是Oslo和我們要介紹的DSL Toolkit還是有些區(qū)別的,這里有一些介紹/keith_short/archive/2008/11/06/oslo-and-the-dsl-toolkit.aspx .Oslo由 “M語言,工具Quadrant,關系存儲組成 GMF,EMF /modeling/gmf/ 使用 Eclipse Modeling Framework (EMF) 和 Graphical Modeling Framework (GMF) 技術來為領域特定語言(DSL)產生領域特定建模(DSM)輔助工具 什么是Visual Studio DSL Vistual Studio DSL 工具,是微軟針對特定領域開發(fā)而專門設計的.包含在Vistual Studio SDK中(vs 2010中將是單獨安裝),允許開發(fā)人員自行設計專屬的圖形化工具,它內置了模型的相關支持,以及模型與圖形之間的支持,還包括對模型的驗證,規(guī)則,事務的支持,同時還允許開發(fā)人員在結合VS.NET的一些擴展VSX一同使用比如工具條,菜單等可以將模型與T4一同使用,從而生成目標代碼Vs.Net現(xiàn)在的類設計器,分布式系統(tǒng)設計器(Distributed System Designer),LinqToSql設計器,EntityFramework設計器都是基于VS.NET DSL開發(fā)的,VS 2010新增了UML Modeling Project,終于提供了對類圖,時序圖,用例圖等的支持,這也是基于Vs.NET DSL來實現(xiàn)的為什么要使用DSL工具 上面介紹了幾種DSL工具,但是我們?yōu)槭裁匆褂盟?它又能給我們帶來什么呢? 很關鍵的一點,DSL和UML不同,是用來解決問題的,而不是描述問題.如果你正在你的工作和解決方案中重復編寫著相同或者相似的代碼,而且這些重復的代碼能夠單獨出來采用生成的方式,那么你就可以考慮結合DSL工具來生成這些代碼. 可能有人會說,那這和使用現(xiàn)有的這些基于數據庫的代碼生成工具(Codesmith,李天平的codematic等)又有何不同呢?DSL是站在領域專家的高度,而非軟件開發(fā)專家來開始解決問題,如果需要對數據庫進行設計,然后再生成代碼Coding,那么你這個工具只能說是開發(fā)人員的一個輔助工具,只是面對實際開發(fā)人員,而這在大型的軟件系統(tǒng)當中會有些力不從心 采用DSL的開發(fā)過程定制 1.找出問題的固定部分,并把這些固定固定部分放在通用架構或平臺中通用的部分基本上都是我們根據長期的經驗和積累抽象出來固定的比如我們使用的Enterprise Library中已經將數據訪問操作,日志操作,驗證緩存等封裝起來提供調用 2.識別可變性和發(fā)現(xiàn)DSL. 找出其中變化的部分,并設計DSL, 通過DSL的表達式或模型提供給問題一個解決方案. 在使用Enterprise Library過程中,你發(fā)現(xiàn)其中大部分的變化的部分其實也相對固定,他們還是基于你的模型,基于你的實體模型,服務模型,如果把這些元數據抽象出來,通過DSL來實現(xiàn)這些元數據的配置,那么就可以把這些部分直接生成到你的目標解決方案中 優(yōu)勢 1.大幅度的提高生產率. 生成代碼可比人工復制粘貼快多了。 2.使系統(tǒng)的規(guī)范性更強. 每個開發(fā)人員對某一個功能的都會有不同的實現(xiàn)方式,采用DSL設計模型,結合代碼生成能夠使功能的實現(xiàn)相對固定. 3.降低了犯錯的機會. 4.使非開發(fā)人員,那些顧問和售前,也能夠直接了解模型。使開發(fā)過程提前,甚至顧問的調研需求時,就可以使用工具和客戶溝通,抽象需求,從而提供給二次開發(fā)人員使用. 5.能夠在較高的抽象層次對解決方案進行驗證,過早的發(fā)現(xiàn)問題. 6.可以基于同一個模型配置不同的技術實現(xiàn)過程.降低技術難度和工作量。比如上次介紹的Sculpture,就可以針對不同的層次,提供不同的技術選擇。針對同一個模型,我們可以選擇使用Entity Framework或者NHibernate。UI層可以選擇A MVC,Sliverlight,WPF等不同的實現(xiàn)方式. 7.DSL不局限于生成我們的技術方案,還可以用來生成構建腳本,文檔,計劃等。 8.使解決方案進行技術轉移變得相對容易,通過修改生成器或解釋器就可以做到。模型元數據相對固定,使我們的解決方案相對規(guī)范。我們只需要生成不同的代碼就可以了。 當然,這也是有前提的,一是開發(fā)DSL,進行抽象整合需要成本。二是并不是所有的解決方案都適合使用DSL,比如一個門戶網站,可能相對固定的部門很少,可以定制的部分也很少,就不適合使用,如果對不適合使用的強制使用就會陷進定制化陷阱。在設計和開發(fā)時,一定要保留一定的靈活性,因為不可能所有的代碼都能夠生成,你必須提供一定的擴展性,保證能夠對生成的代碼進行擴展。另外就是一定要保證實現(xiàn)的規(guī)范,實現(xiàn)方式太多,會導致你的DSL過于復雜。有些時候你甚至需要舍棄一些實現(xiàn),舍棄一些需求。“簡單的問題的解決應該簡單化,復雜問題的解決應該可能化”(smalltalk的創(chuàng)始人AlianKay). 系列介紹 本系列一開始將通過一個案例簡單的介紹DSL的開發(fā)流程,這個案例來源于DSL Tools Lab,主要介紹DSL的一些簡單開發(fā)方法,其中也包括T4與DSL結合完成代碼生成,DSL工具的部署. 主要是完成一個狀態(tài)機的DSL應用,具體我們會在接下來一一介紹。 對DSL的開發(fā)有過簡單的了解后,我們會對完成一個實際使用的完整的開發(fā)工具的開發(fā)。在這個過程中也會包含介紹DSL設計和開發(fā)過程以及應該注意的問題,當然也會包括DSL以及VSX的一些比較深層次的應用。 參考 Visual Studio DSL 工具特定領域開發(fā)指南 Doamin-Specific Development With Visual Studio DSL Tools Visual Studio DSL 入門 2 相信如果看過一上篇你已經對 dsl有了一定的了解,接下來我們就來開始我們的這個系列的入門,V Dsl在國內可能使用的人少之又少,不過希望這個系列能夠使看到的人能夠對dsl有一定的了解,使之能夠成為產品方案選型時的一個參考,能夠對閱讀的人有所幫助. 準備環(huán)境 由于 2010并未正式發(fā)布,所以這一系列基于vs 2008 sp1進行開發(fā),Dsl tools是包含在VSX當中的,所以需要下載 Vistual Stutio.Net SDK 1.1安裝,下載地址為:/zh-cn/vsx/default(en-us).aspx 另外代碼生成采用的是T4,為了方便T4的編寫,需要下載T4編輯器/,遺憾的是V至今還沒有內置T4編輯器,在vs 2010中也不會提供。 需求說明 我們完成的這個簡單的Demo類似于UML中的狀態(tài)圖(Statechart Diagram), 這個狀態(tài)機由狀態(tài)(states)組成,各狀態(tài)由轉移(transitions)鏈接在一起。狀態(tài)是對象執(zhí)行某項活動或等待某個事件時的條件。轉移是兩個狀態(tài)之間的關系,它由某個事件觸發(fā),然后執(zhí)行特定的操作或評估并導致特定的結束狀態(tài)。 狀態(tài)(State)的要素: 名稱: 將一個狀態(tài)與其他狀態(tài)區(qū)分開來的文本字符串;狀態(tài)也可能是匿名的,這表示它沒有名稱。 分類: 狀態(tài)分為初始狀態(tài)(initial state)和結束狀態(tài)(end state). 進入/退出操作: 在進入和退出狀態(tài)時所執(zhí)行的操作。 內部轉移: 在不使狀態(tài)發(fā)生變更的情況下進行的轉移。 子狀態(tài): 狀態(tài)的嵌套結構,包括不相連的(依次處于活動狀態(tài)的)或并行的(同時處于活動狀態(tài)的)子狀態(tài)。 延遲的事件: 未在該狀態(tài)中處理但被延遲處理(即列隊等待由另一個狀態(tài)中的對象來處理)的一系列事件。 轉移(Transitions)的要素: 源狀態(tài): 轉移所影響的狀態(tài);如果對象處于源狀態(tài),當對象收到轉移的觸發(fā)事件并且滿足警戒條件(如果有)時,就可能會觸發(fā)輸出轉移。 事件觸發(fā)器: 使轉移滿足觸發(fā)條件的事件。當處于源狀態(tài)的對象收到該事件時(假設已滿足其警戒條件),就可能會觸發(fā)轉移。 事件一般都有一個名稱,但是有些轉移沒有事件名稱,稱為自動或隱式轉移. 警戒條件: 一種布爾表達式。在接收到事件觸發(fā)器而觸發(fā)轉移時,將對該表達式求值;如果該表達式求值結果為 True,則說明轉移符合觸發(fā)條件;如果該表達式求值結果為False,則不觸發(fā)轉移。如果沒有其他轉移可以由同一事件來觸發(fā),該事件就將被丟棄。 操作: 可執(zhí)行的、不可分割的計算過程,該計算可能直接作用于擁有狀態(tài)機的對象,也可能間接作用于該對象可見的其他對象。 目標狀態(tài)(可選): 在完成轉移后被激活的狀態(tài)。 參數: 轉移可能有參數,這個參數為事件觸發(fā)器的事件方法的參數 事先弄清楚這段說明是很重要的,因為我們的模型,我們的元數據都來源于需求問題的描述 計劃 一個簡單的入門系列計劃大致包含幾下幾步: 1. 創(chuàng)建一個簡單的DSL模型 2. 創(chuàng)建我們的元數據模型,包含狀態(tài)機(StateMachine),狀態(tài)(State),轉移(Transition).可能實際的會對我們需求有些取舍,比如不考慮子狀態(tài)等. 3. 創(chuàng)建相對我們的元數據模型的圖形展現(xiàn). 4.規(guī)范我們的模型和圖.添加規(guī)則(Rule)和驗證(Validation) 5.在Visual Studio實驗室環(huán)境中測試我們的Dsl項目 6.改善我們的用戶界面. 7.針對我們限定的元數據針對一個框架創(chuàng)建代碼生成. 8.創(chuàng)建安裝程序發(fā)布Dsl項目安裝包資源 1.DSL Tools Lab /DSLToolsLab 系列教程 2.臺灣微軟Paul的DSL系列視頻教程 /zh-tw/vstudio/cc963628.aspx 3.Domain-Specific Development with Visual Studio DSL Tools 目前知道的唯一一本關于專門關于Vs.NET DSL的書,有對應的中文譯本. 4.VSX的一系列深入進階 /blogs/divedeeper/default.aspx?PageIndex=1 Visual Studio DSL 入門 3-創(chuàng)建一個簡單的DSL模型 從這節(jié)開始我們就開始我們的DSL之旅, 首先確保你已經安裝了Visual Studio Sdk,并且使用的是Visual Studio 2008.我們先大概創(chuàng)建一個簡單的DSL項目,通過這個項目來了解dsl的開發(fā)環(huán)境和流程.1. 打開VS.NET ,新建-項目, 點擊其它項目類型-擴展性(Extensibility). 這里列出來了擴展類型的項目,包括Addin,VSPackage,Dsl等項目類型,選擇Domain Specific Lan guage Designer”,點擊確定 2.接下來進入DSL創(chuàng)建向導,將會提供四種DSL模型模板提供我們選擇,其實他們只是給我們提供了不同的Sample提供查看,也方便我們更方便的開始. Class Diagrams 由UML類圖組成,包含類,接口,關系,組合,屬性,操作等. Component Models 組件模型,子組件組成的組件. Minimal Language 只包含一個簡單的空的語言模型 Task Flow 創(chuàng)建類似UML狀態(tài)圖模型 3. 在這里我們選擇Minimal Language,并保持Language Name默認即可,點擊下一步,設計Language的模型文件的后綴名和文件圖標。如果你輸入的后綴名已經被使用,中間的框中會列出搜索到的注冊的后綴名列表。在這里我們輸入sm作為后綴名,保持使用默認的圖標. 4. 點擊下一步,進入到產品設置,主要設計產品名稱,所屬公司,項目名稱空間.這些信息將會包含在最后生成的項目中,在最后的產品部署中起到作用。在這里我們不進行更改,可以直接保持默認即可. 5. 下一步進入到簽名設置,在擴展開發(fā)中任何需要部署的Package都需要強命名(將會注冊到GAC),可以選擇自動創(chuàng)建一個Key,也可以選擇使用已有的key. 6. 我們選擇直接創(chuàng)建強命名key,點擊下一步,這是一個設置總結界面: 我們直接能查看到所有的設置信息,可以通過上一步下一步進行更改,也可直接點擊左側的導航來定位更改,確認無誤后,點擊完成。向導(Wizard)會自動給我們構建項目.我們暫且不管生成的這些項目結構,切換到解決方案資源管理器,點擊上面的最后面的按鈕“轉換所有模板”(Transalte All Template).完成后,點擊Debug運行,就會打開Visual Studio實驗室環(huán)境(Experimental hive),也就是上面的Minimal Language界面,可以大概操作一下了,相當神奇吧,這就完成了第一個DSL項目的開發(fā).同樣你也可以選擇其它三種模型,效果在上面已經列出來了. 7. 我們再來看一下生成的項目結構,整個解決方案總共有兩以下兩個項目組成(其它有三個,另外就是運行后的Testing項目,稍后介紹). Dsl: 根據你的模型數據(DslDefinition.dsl文件)生成的有關模型的操作,包括模型關系,序列化,圖形,連接器等 DslPackage: 支撐Dsl能夠在V里運行,以及和V交互的操作,包括菜單,工具條,游覽器等 Dsl項目設置成了針對DslPackage項目的友元程序集(通過AssemblyInfo的InternalsVisibleTo),DslPackage中可以直接訪問Dsl中的內部成員,DslPackage其實也是根據DslDefinition.dsl生成的深入了解這兩個項目的結構是非常有必要的,我們會在隨后的深入過程中介紹。 8. 查看這兩個項目,發(fā)現(xiàn)大部分都是由后綴名為tt的文件組成,這就是t4文件(Text Templating Transformation Toolkit),類似于asp,ruby這樣的解釋性語言,讀我們的模型生成cs代碼,可以看到每個tt文件都附屬了一個cs代碼文件.綁定到了每個t4文件可以右鍵運行自定義工具Run Custom Tool,就會調用TextTemplatingFileGenerator解析t4模板文件生成目標代碼,也可以向我們剛才那個點擊上面的按鈕轉換所有的模板文件. 9. 打開Dsl項目中的DslDefinition.dsl文件.(這是通常情況下我們使用的最重要的文件,包括我們的Dsl的所有的模型元素數據,它附屬的DslDefinition.dsl.Diagram是它的圖形顯示文件). 這就是模型設計的主區(qū)域,我們來看一下它的組成部分: 1). 工具條,這里包括模型,關系,圖形. 這個工具條與.Dsl文件關系。 2). 模型元數據. 這些概念的東西我們在下一切會介紹. 3). 圖形展現(xiàn). 設計模型的展現(xiàn)信息,通過中間的那條線與模型對應起來 4). Dsl Details編輯窗口, 用來編輯Dsl相關的一些信息,比如關系。 5). 解決方案文件夾,注意上面的黃色區(qū)域就是”轉換所有模板“按鈕,點擊下面的Dsl Explorer頁簽,切換到Dsl瀏覽器. 這里會列出來當前Dsl文件里的模型,模型元素Element,圖Shape,類型,連接器Connector,Connection Builders,以通讀對模型瀏覽器,工具條,序列化的設置。我們對Dsl的大部分設計都會在這里完成. Ok,就到這里,下次將介紹一些基礎概念. Visual Studio DSL 入門 4- 基本概念 剛接觸Visual Studio DSL時,被它的基本理論概念迷惑了很長時間, 我的建議是如果能夠很快的理解這些概念最好.如果短時間內理解不了就大概了解下這些基礎概念,就沒有必要為了每一個概念一直深入,搞得自己頭疼,倒不如在以后的實踐中慢慢深入,理解并加深這些概念. 開發(fā)一個DSL需要創(chuàng)建的幾個不同的組成部分:域模型,圖形符號,工具箱,資源管理器和屬性窗口,驗證,序列化和部署,打開上一節(jié)我們創(chuàng)建的LanguageSm項目中的DslDefinition.dsl文件,可以看到在中心文檔區(qū)域有左右兩部分(兩個泳道). 1.左側是元數據模型(域模型). 也就是域類和域關系 2.右側是圖形符合,也就是圖形元素(Diagram Elements). 其實我們是在用DSL本身在創(chuàng)建DSL,這些描述本身也是在用DSL 另外,域模型與圖形符號之間通過連接器(Connectors)連接,域類之間可以通過關系relationships連接. 域模型 (Domain Model) 每一個DSL的核心都是一個域模型,它定義了語言所代表的各種概念,它們的屬性,以及它們之間的關系。在模型驅動開發(fā)中,我們的模型要抽象出來,并用DSL的語法描述出來,這也就是用域模型來描述,只要我們有了域模型,工具箱,圖形展現(xiàn)都是基于域模型然則創(chuàng)建的。 域模型有兩個概念: 1.根域類(root Domain Class) 任何一個DSL有且只有一個根域類,它和你的圖形對應,這里說的圖形是整個圖形的概念。從我們上一節(jié)的項目中可以看到,我們創(chuàng)建的時候默認就自動創(chuàng)建了根域類(ExampleModel)和它對應的圖形(ExampleShape)。 2.域類(Domain Class) 和根域類不一樣,ExampleElement是真正意義上的模型。并且它有一個屬性,名稱為Name,類型為String. 域關系(domain relationships) 1.嵌入關系(embedding relationship) 嵌入關系表示一個模型能夠嵌入在另外一個模型中。在我們的dsl中的可以找到嵌入關系ExampleModelHasElements,把ExampleModel和ExampleElement聯(lián)系起來(見下圖). 在ExampleModel這一端的屬性名為Elements,這個集合屬性是它包含所有的ExampleElement, 重數為0.*,表達它可以包含零個或者多個ExampleElement, 域角色是指它在這個關系中扮演的角色,角色名你可以通過點擊域角色(這條線)在右面的屬性里面看到,角色名往往和這一端的源屬性名相反,和另外一端的屬性名一致。 在ExampleElement這一端的屬性名為ExampleModel,表示它所從屬的ExampleModel類型,重數為1.1 ,表示它可以并且只可以從屬于一個ExampleModel. 簡單來說,這個嵌入關系也就表示了在我們的上一切最后運行起來的Dsl中,我們的ExampleModel模型中能夠放多個ExampleElement,對于每一個ExampleElement只能從屬于一個ExampleModel. 2.引用關系(reference relationship) 在我們的Dsl中看到引用關系ExempleElementReferencesTargets把兩個ExampleElements關系起來,表示在兩個ExampleElement之間可以建立ExempleElementReferencesTarget關系,引用關系一般有圖形表示,所以在設計時通過拖動一條線來把兩個模型關系起來,和嵌入關系一樣,引用關系也可以設置多重性,表示是否允許和多個模型同時建立引用關系。在我們的例子中源和目標相同,重數為0.*,表示一個ExampleElement可以與多個其它的ExempleElement建立引用關系。 注意這里這不是代表著兩個ExampleElement之間可以建立多個重復的引用關系,而是指不同的ExampleElement之間。允許重復的關系需要在關系的屬性中設置Allows Duplicates為True.另外很重要的一點,Dsl會對每個域關系生成一個單獨的類,模型中建立的每個關系都是這個類的一個實例。我們可以通過屬性中的Code下面屬性進行設置來控制生成的代碼,我們可以設置GeneratesDoubleDerived屬性為True,每個關系會生成兩個類,父類ExampleModelHasElementsBase包含所有的實現(xiàn),子類ExampleModelHasElements是一個partial類,所以你可以重載父類的方法來實現(xiàn)你自己的邏輯。另外我們也可以通過這種機制來實現(xiàn)生成的代碼里實現(xiàn)某個我們自定義的接口。注意,同樣也可以在域類上進行設置。 在這里我覺得有必要對幾個概念加強區(qū)分一下: 域類域模型: 域模型包含域類和域關系,域類代表領域中的不同的類型,域關系代表兩個域類中的關系信息。 (1) 域模型 -虛線里所所有的 (2) 域類Library (3) 域類Person (4) 域關系 (5)重數 * (表示在一個域模型中,一個Library可以有多個Person). (6)重數 1 (表示一個Person,只能存在于一個Library中). (7)源角色 (8)目標角色 域屬性屬性 在一個域模型中,一個域類可以有一堆域屬性,這是和領域掛鉤的,是對元數據的描述。但是對于每個域類,我們還可以在DSL設計器中的屬性編輯器中,也會列出來一些屬性,比如描述,名稱等。注意這里的名稱屬性和這個域類所具有的Name屬性是不一樣的。這里的屬性列出來的是域類的屬性,也就是這個域類叫什么名字. 而Dsl圖中列出來的是它的領域屬性,而且每個域屬性其實也是一個元素,所以他本身也會有一些屬性,這里的Name其實就是它在圖中顯示出來的名字。 好了,今天就到這里,先消化下. Visual Studio DSL 入門 5-理解生成的域類和域關系 上一節(jié)我們大概介紹了一些V Dsl的域模型的一些基本的概念,這一節(jié)我們再回到我們生成的LanuageSm項目,看一下生成的域類以及域關系,介紹一下Dsl運行時的Store,然后再來介紹一下需要注意的一些關鍵點。為我們下一節(jié)具體設計我們自己的Dsl做最后的準備. 1. 首先找到Dsl項目中模板DomainClasses.tt生成的DomainClasses.cs,我們來查看一下它由兩個類組成: 其實也就對應著我們域模型中的根域類ExampleModel和域類ExampleElement.我們仔細再來看一下ExampleElement類的具體結構.可以發(fā)現(xiàn): 1).字段是Guid類型的,這樣更方便關系類中直接引用屬性,后續(xù)我們也會發(fā)現(xiàn)在驗證,規(guī)則中也會經常使用屬性的Guid字段變量來代表屬性. 2).我們看到上一節(jié)我們看到的關系生成的屬性,ExampleElement與ExampleModel的嵌入關系,生成了ExampleModel類型的ExampleModel屬性. ExampleElement與自身的引用關系,由于重數是*,生成了強集合類型LinkedElementCollection屬性. 3).屬性中的Name代表域類的域屬性Name。 2. 我們再來看一下域關系,找到DomainRelationships.tt生成的類文件DomainRelationships.cs,查看類圖,顯示類圖中的屬性為關系或者是組合關系: 1)可以看到域關系對應的類通過Guid對應的字段關聯(lián)域類. 2)通過上面的類圖,可以看到域關系類對應的屬性與域類的關系,它分別存儲了關系對應的源Source和目標Target的屬性。 3)我們可以找到一些靜態(tài)方法,比如在ExampleModelHasElements類中: GetElements(ExampleModel) - 獲取關系中一個ExampleModel對應的所有的ExampleElement GetExampleModel(ExampleElement) -獲取關系中一個ExampleElement對應的ExampleModel 另外還可以通過GetLink,GetLinks, GetLinksToElements,獲取指定元素之間的關系。 3.很有必要在這里也對Dsl的運行的機制有一些了解 ,那就必須在這里介紹一下Store. 1)在Dsl運行期間,模型元素都被存儲在內存中的Store中,Sotre也提供了一系列的操作:模型元素和關系的創(chuàng)建,操作,刪除,Redo/Undo,規(guī)則,事件等,相當重要,在Dsl開發(fā)中經常會涉及到Store的操作。 2)當一個模型文件被打開時,會自動重建一個Store,并且加載模型文件中的所有的模型和關系的實例,這個過程我們會在后面介紹。 3) 每一個域類都繼承ModelElement,每個域關系都繼承自ElementLink(ElementLink其實也繼承于ModelElement). 在Store中加載的每個模型其實都是ModelEment的一個實例,每個域關系都是ElementLink的一個實例??梢酝ㄟ^Store甚至可以操作它們的屬性,監(jiān)聽創(chuàng)建,刪除等事件. 4.有一些細節(jié)性的應該注意的問題在這里零散的總結一下: 1).區(qū)分兩個域類是嵌入關系還是引用關系,可以考慮這域類在模型瀏覽器里的展現(xiàn),如果嵌入在模型瀏覽器中(Model Explorer)那就可以采用嵌入關系,否則就是引用關系. 2).關系的重數雖然可以任意選擇,但是在有些情況下會有些限制,比如在嵌入式關系中: 嵌入關系目標角色的重數可為One 或者是ZeroOne,因為一個ModelElement只能被嵌入一次. 如果一個ModelElement是多個嵌入關系中的目標角色,那么目標角色的重數必須都為ZeroOne,因為它只能在同一時間在一個關系中扮演目標角色。 在一個完整的域模型中,每個域類(根域類除外)必須是一個嵌入關系的目標,不然就不能夠構成一個完整的模型樹,也就不能夠處理序列化 當然,可能大家會對這些規(guī)則有些不知所措,沒關系,你可以不理這些規(guī)則,按照你的方式去設計,在保存或者是驗證(右鍵Validate All)時,會在下面的錯誤窗口提示你的。 3)每個域類都應該有Name Domain Property.可以通過從工具欄拖Named Domain Class創(chuàng)建域類,自動帶出此域屬性,也可以手動添加域屬性,然后指定域屬性的Is Element Name 為True,此屬性的值會在序列化處理時使用. Visual Studio DSL 入門 6-DSL的圖形表示1 到現(xiàn)在為止,我們還是只是介紹模型相關的東西,還沒有接觸到Dsl的模型的展現(xiàn),對于一個Dsl來說,沒有圖形展現(xiàn)也是可行的,不過對于一個開發(fā)工具來說,要提供一種方式來操作我們的元數據,Visual Studio DSL在圖形展現(xiàn)這方面提供了不錯的支持,不過對于復雜的Dsl來說,圖形的展現(xiàn)往往需求很復雜,現(xiàn)在的圖形化支持在一定程度上也未必能夠滿足一些特定的需求, 有總比沒有好,期望微軟會在這方面會有所加強。 還是以我們創(chuàng)建的LanguageSm項目為例,我們大概介紹一下界面表示相關的概念,打開DslDefinition.dsl文件,這次我們看泳道(也就是樹線)的右邊: 一. 圖表 我們看最下面的LanguageSmDiagram,這就是圖表元素,它是存儲形狀和連接器映射的容器,代表設計界面自身,映射到模型的根域類(圖形元素Diagram Elements都是與模型相對應的),也就是映射到我們例子里的ExampleModel,我們來看一下圖表的屬性: 在這里,我們可以對圖表的外觀,代碼,文檔,公開樣式屬性,資源幾個方面進行屬性設置,Dsl會收集設置的這些信息,然后根據T4模板,在Dsl項目的Generate Code文件夾下面生成Diagram類,我們也可以對這個類進行擴展,實現(xiàn)圖表方面的一些自定義,比如設置背景圖,顯示網絡等。如果你想實現(xiàn)Dsl模型的自己的界面表示方式,也需要實現(xiàn)自己的圖表元素Diagram類. 二.編輯器 編輯器分為兩種類型:(圖形)設計器和自定義編輯器.編輯器的定義在Dsl資源管理器(Dsl Explorer)中的“編輯器”(editor)節(jié)點下,這里的定義的屬性用于生成EditorFactory類(熟悉VSX的應該知道,我們會在后面介紹),工具箱等,我們來看一下默認的設計器的屬性: 這里需要提示一下,在dsl設計的過程中,有很多時候需要dsl瀏覽器和屬性對應操作使用,可以通過右鍵屬性來進行設置。 屬性里設置了編輯器對應的圖表元素,編輯器的GUID,根域類,以及存儲Dsl模型的文件擴展名,與文件關聯(lián)的圖標?;蛟S你不太明白這些屬性代表什么意義,沒有關系,以后會明白的。 我們在第一節(jié)就說過, Dsl模型并不一定要有圖形編輯器的,我們也可以在這里添加我們自定義的編輯器,你可以右鍵刪除默認的Editor,然后在根結點LanguageSm上右鍵添加自定義編輯器,然后設置上面說的那些屬性,然后實現(xiàn)自己的DocView,在這里有詳細流程,具體的方法我們也會在后面詳細介紹. 三.形狀 形狀是Dsl圖形符號的重點,因為形狀和模型元素一一對應(前面說的ExampleShape是一個幾何形狀,和根域類對應),可以使模型元素形象化,這也是Vs.Net DSL圖形化DSL的特點. 形狀又分為以下五個不同的類型,這五個形狀在工具箱上都有,可以直接拖動到圖形區(qū)域創(chuàng)建對應的形狀,建議現(xiàn)在沒有必要太去細化,而只需要記住他們的樣式,能夠按需所有,具體怎么設置還是到使用的時候再去研究: 1.幾何形狀(GeometryShape) 左側為形狀的模型,右側為調試后運行的顯示模型,形狀中的文本裝飾器NameDecorator就是用來控制我們顯示圖形中的文本,你可以查看裝飾器的屬性,控制文本的顯示,包括文本,顯示位置等. 對于幾何形狀,除了文本裝飾器以外,你還可以添加IconDecorator(裝飾圖形上顯示圖標),ExpandCollapseDecorator(裝飾圖形的展開收縮) 2.隔間形狀(CompartmentShape) 隔間形狀是帶有隔間的幾何形狀,一個隔間形狀有可以有多個隔間: 同樣,對于隔間形狀,你也可以象幾何形狀那樣添加其它的裝飾器. 3.圖像形狀(ImageShape) 圖像形狀是顯示圖形非輪廓的形狀: 可以看到,圖像形狀顯示的和我們普通的幾何形狀是不一樣的,我們可以針對圖象開關設置顯示的圖像和圖標資源,我們來看一下上面的圖像形狀的屬性,在最下面我們定義了顯示的圖標: 4.端口(PortShape) 端口是依附在形狀輪廓上,并只能繞輪廓移動的特殊形狀,除此之外,和普通的幾何形狀沒有區(qū)別。 5.泳道(Swimlane) 泳道用來將圖表分割成行或例,我們看下面的狀態(tài)流程圖: 參考資源 1. Visual Stuido DSL 工具特定領域開發(fā)指南 2.Using WPF As The Designer Surface In DSL Tools Gokhan AltinorenVisual Studio DSL 入門 7-DSL的圖形表示2 在上一節(jié)介紹了 dsl的圖形符號,其中包括圖表,編輯器,形狀.在這一節(jié),我們來看一下圖形符號與元數據之間的關系,他們是怎么映射在一起的. 模型元素由形狀來表示,而域關系則用連接器(Connectors)來表示.圖形映射定義了模型元素通過形狀可視化表示出來,而連接器映射定義了鏈接如何通過連接器可視化表示出來. 形狀映射 我們先來看一下形狀映射,接著打開我們的LanguageSm項目中的Dsl文件. 選中域類ExampleElement與圖形ExampleShape之間的線,可看下面的Dsl details: 這個窗口有兩個tab,General tab主要是定義域類和圖形間的連接, 可以選擇形狀,域類,設置他們之間的映射關系,Parent element path(父元素路徑)指出了引用的域類的邏輯父元素,以及當前形狀應當以哪個圖表元素作為父親. 為什么需要指定父元素路徑呢?因為設計器在運行時,所有的圖表元素(除了圖表本身),都必須有父圖表元素(可以是圖表或形狀),這樣這個圖表才能夠知道自己放在哪里,所以我們在這里需要指定形狀被創(chuàng)建后哪個圖表元素將作為它的父親. 父元素路徑使用簡單的路徑語法來表示整個元素和鏈接結構,在我們這個例子中,它指出了從ExampleElement出發(fā)順著ExampleModelHasElements.ExampleModel/!ExampleModel這條中徑得到的元素對對應的圖表元素,就是形狀的父元素所在的圖表,在這個例子里,也就是圖表本身ExampleModel元素,因為我們的ExampleShape是直接放在圖形上的。 另外兩個可設置的項,具有自定義的父形狀(Has custome Parent Shape),具有自定義的父元素(Has custom parent element),當選中時,生成的代碼會添加自定義的代碼段,你必須實現(xiàn)對應的方法才能夠編譯通過,在指定的方法里,你可以自已返回父元素和父形狀. 隱藏行號 復制代碼 ? 1. if(element is global:Company.LanguageSm.ExampleElement)2. 3. / Method:4. / private DslDiagrams:NodeShape CreateShapeForExampleElement(ExampleElement newElement)5. / 6. / 7. / must be implemented in a partial class of LanguageSmDiagram. Given an instance of ExampleElement,8. / the method should return a new shape or connector instance that should be associated with this element. If no shape or connector should be created, the method should return null.9. DslDiagrams:NodeShape newShape = CreateShapeForExampleElement(global:Company.LanguageSm.ExampleElement)element);10. if(newShape != null) newShape.Size = newShape.DefaultSize; / set default shape size11. return newShape;12. 你必須在LanguageSmDiagram的partial類里面實現(xiàn)這個GetShapForExampleElement方法才能夠編譯通過. 裝飾器映射 我們再來看一下Decorator tab,這里主要是映射屬性和裝飾器,在某些情況下,裝飾器的外觀可能會需要隨著模型信息的更改而動態(tài)更改,裝飾器映射主要是來定義這一行為。 上面顯示的是Dsl中的ExampleShape的Name裝飾器的裝飾器映射,顯示屬性(Display Property)主要是針對文本裝飾器(text decorator),在這里也就是用來設置需要顯示的文本對應的域類的域屬性. 可見性篩選器(Visibility Fi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論