Visual Studio DSL 入門 5—理解產生的域類和域關係

來源:互聯網
上載者:User

     上一節我們大概介紹了一些Vs.net Dsl的領域模型的一些基本的概念,這一節我們再回到我們產生的LanuageSm項目,看一下產生的域類以及域關係,介紹一下Dsl運行時的Store,然後再來介紹一下需要注意的一些關鍵點。為我們下一節具體設計我們自己的Dsl做最後的準備.
   1. 首先找到Dsl項目中模板DomainClasses.tt產生的DomainClasses.cs,我們來查看一下它由兩個類組成:
       
     其實也就對應著我們領域模型中的根域類ExampleModel和域類ExampleElement.我們仔細再來看一下ExampleElement類的具體結構.可以發現:
       1).欄位是Guid類型的,這樣更方便關係類中直接引用屬性,後續我們也會發現在驗證,規則中也會經常使用屬性的Guid欄位變數來代表屬性.
       2).我們看到上一節我們看到的關係產生的屬性,ExampleElement與ExampleModel的內嵌關係,產生了ExampleModel類型的ExampleModel屬性.   ExampleElement與自身的參考關聯性,由於重數是*,產生了強集合類型LinkedElementCollection<ExampleElement>屬性.
       3).屬性中的Name代表域類的域屬性Name。

 

     2. 我們再來看一下域關係,找到DomainRelationships.tt產生的類檔案DomainRelationships.cs,查看類圖,顯示類圖中的屬性為關係或者是組合關係:
       

           1)可以看到域關係對應的類通過Guid對應的欄位關聯域類.
           2)通過上面的類圖,可以看到域關係類對應的屬性與域類的關係,它分別儲存了關係對應的源Source和目標Target的屬性。
           3)我們可以找到一些靜態方法,比如在ExampleModelHasElements類中:
GetElements(ExampleModel)  ---  擷取關係中一個ExampleModel對應的所有的ExampleElement
              GetExampleModel(ExampleElement)  --擷取關係中一個ExampleElement對應的ExampleModel
              另外還可以通過GetLink,GetLinks, GetLinksToElements,擷取指定元素之間的關係。

   3.很有必要在這裡也對Dsl的啟動並執行機制有一些瞭解 ,那就必須在這裡介紹一下Store.
         1)在Dsl運行期間,模型元素都被儲存在記憶體中的Store中,Sotre也提供了一系列的操作:模型元素和關係的建立,操作,刪除,Redo/Undo,規則,事件等,相當重要,在Dsl開發中經常會涉及到Store的操作。
         2)當一個模型檔案被開啟時,會自動重建一個Store,並且載入模型檔案中的所有的模型和關係的執行個體,這個過程我們會在後面介紹。
         3) 每一個域類都繼承ModelElement,每個域關係都繼承自ElementLink(ElementLink其實也繼承於ModelElement). 在Store中載入的每個模型其實都是ModelEment的一個執行個體,每個域關係都是ElementLink的一個執行個體。可以通過Store甚至可以操作它們的屬性,監聽建立,刪除等事件.

   4.有一些細節性的應該注意的問題在這裡零散的總結一下:
        1).區分兩個域類是內嵌關係還是參考關聯性,可以考慮這域類在模型瀏覽器裡的展現,如果嵌入在模型瀏覽器中(Model Explorer)那就可以採用內嵌關係,否則就是參考關聯性.
        2).關係的重數雖然可以任意選擇,但是在有些情況下會有些限制,比如在嵌入式關係中:
              內嵌關係目標角色的重數可為One 或者是ZeroOne,因為一個ModelElement只能被嵌入一次.
              如果一個ModelElement是多個內嵌關係中的目標角色,那麼目標角色的重數必須都為ZeroOne,因為它只能在同一時間在一個關係中扮演目標角色。
              在一個完整的領域模型中,每個域類(根域類除外)必須是一個內嵌關係的目標,不然就不能夠構成一個完整的模型樹,也就不能夠處理序列化
           當然,可能大家會對這些規則有些不知所措,沒關係,你可以不理這些規則,按照你的方式去設計,在儲存或者是驗證(右鍵Validate All)時,會在下面的錯誤視窗提示你的。
        3)每個域類都應該有Name Domain Property.可以通過從工具列拖Named Domain Class建立域類,自動帶出此域屬性,也可以手動添加域屬性,然後指定域屬性的Is Element Name 為True,此屬性的值會在序列化處理時使用. 
 

作者:孤獨俠客(似水流年)
出處: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.