上一節我們大概介紹了一些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/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。