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

Visual Studio DSL入門 4--- 基本概念

編輯:關於.NET

開發一個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/

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