程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Visual Studio DSL入門 5---理解生成的域類和域關系

Visual Studio DSL入門 5---理解生成的域類和域關系

編輯:關於.NET

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/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved