Visual Studio DSL 入門 4— 基本概念

來源:互聯網
上載者:User

     剛接觸Visual Studio DSL時,被它的基本理論概念迷惑了很長時間, 我的建議是如果能夠很快的理解這些概念最好.如果短時間內理解不了就大概瞭解下這些基礎概念,就沒有必要為了每一個概念一直深入,搞得自己頭疼,倒不如在以後的實踐中慢慢深入,理解並加深這些概念.

     開發一個DSL需要建立的幾個不同的組成部分:領域模型,圖形符號,工具箱,資源管理員和屬性視窗,驗證,序列化和部署,開啟上一節我們建立的LanguageSm項目中的DslDefinition.dsl檔案,可以看到在中心文檔地區有左右兩部分(兩個泳道).
1.左側是中繼資料模型(領域模型). 也就是域類和域關係.
      2.右側是圖形符合,也就是圖形元素(Diagram Elements).
    其實我們是在用DSL本身在建立DSL,這些描述本身也是在用DSL.

  
    另外,領域模型與圖形符號之間通過連接器(Connectors)串連,域類之間可以通過關係relationships串連.
領域模型 (Domain Model)
     每一個DSL的核心都是一個領域模型,它定義了語言所代表的各種概念,它們的屬性,以及它們之間的關係。在模型驅動開發中,我們的模型要抽象出來,並用DSL的文法描述出來,這也就是用領域模型來描述,只要我們有了領域模型,工具箱,圖形展現都是基於領域模型然則建立的。
領域模型有兩個概念:
     1.根域類(root Domain Class)
        任何一個DSL有且只有一個根域類,它和你的圖形對應,這裡說的圖形是整個圖形的概念。從我們上一節的項目中可以看到,我們建立的時候預設就自動建立了根域類(ExampleModel)和它對應的圖形(ExampleShape)。
     2.域類(Domain Class)
        和根域類不一樣,ExampleElement是真正意義上的模型。並且它有一個屬性,名稱為Name,類型為String.
域關係(domain relationships)
     1.內嵌關係(embedding relationship)
         內嵌關係表示一個模型能夠嵌入在另外一個模型中。在我們的dsl中的可以找到內嵌關係ExampleModelHasElements,把ExampleModel和ExampleElement聯絡起來(見).    
       
        在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包含所有的實現,子類ExampleModelHasElements是一個partial類,所以你可以重載父類的方法來實現你自己的邏輯。另外我們也可以通過這種機制來實現產生的程式碼裡實現某個我們自訂的介面。注意,同樣也可以在域類上進行設定

          

   在這裡我覺得有必要對幾個概念加強區分一下:
    域類---領域模型:
         領域模型包含域類和域關係,域類代表領域中的不同的類型,域關係代表兩個域類中的關係資訊。
                 
            (1) 領域模型  --虛線裡所所有的
            (2) 域類Library
            (3) 域類Person
            (4) 域關係 
            (5)重數 *  (表示在一個領域模型中,一個Library可以有多個Person).
            (6)重數  1   (表示一個Person,只能存在於一個Library中).
            (7)源角色
            (8)目標角色

      域屬性---屬性 
             在一個領域模型中,一個域類可以有一堆域屬性,這是和領域掛鈎的,是對中繼資料的描述。但是對於每個域類,我們還可以在DSL設計器中的屬性編輯器中,也會列出來一些屬性,比如描述,名稱等。注意這裡的名稱屬性和這個域類所具有的Name屬性是不一樣的。這裡的屬性列出來的是域類的屬性,也就是這個域類叫什麼名字.
              
             而Dsl圖中列出來的是它的領域屬性,而且每個域屬性其實也是一個元素,所以他本身也會有一些屬性,這裡的Name其實就是它在圖中顯示出來的名字。
              

       好了,今天就到這裡,先消化下.

作者:孤獨俠客(似水流年)
出處:http://lonely7345.cnblogs.com/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.