WCF RIA 服務 (十七)- 數據 7

數據模型中的繼承
WCF RIA Services允許我們使用做爲繼承體系中的一部分的實體。一個繼承模型包含了一個從其他數據類派生的數據類。例如,一個多態繼承模型可以包含一個 Customer實體和兩個從Customer派生的實體(PublicSectorCustomer和PrivateSectorCustomer)。 通過RIA Services,我們可以在domain Services中寫一個返回一個根類型的集合和從根類型派生的類型的查詢方法。或者,可以寫一個僅返回派生類型集合的查詢方法。還可以寫修改根類型或任 何派生類的操作方法。
注:只在VS2010和SL4中使用RIA Services時支持繼承,在VS2008和SL3中不支持。

數據模型
在 服務端項目中,我們可以像定義其他數據類那樣來爲繼承模型定義數據類。使用的這個對象模型既可以是從數據層中自動生成的類也可以是手動創建的數據類。
我 們不必非要通過domain service來公開整個層次。相反,在domain service中公開的層次中最後派生的類,是與客戶端交互的根類。從根類型派生出的類型可以向客戶端公開,但父類型不必被公開。在根類中,必須把想要公 開的的任意派生類型包含在KnownTypeAttribute屬性中。如果想要忽略派生類型,可以不把它包含在KnownTypeAttribute屬 性中。下面示例了一個包含基類Customer,和兩個派生類PrivateSectorCustomer,PublicSectorCustomer的 手工創建的數據模型。兩個派生類會包含在Customer類的KnownTypeAttribute屬性下,因爲Customer是數據操作的根類型。

多 態查詢
定義了數據模型後,我們創建一個對客戶端公開類型的domain service。當在一個查詢方法中公開一個類型時,可以返回這個類型和任意派生的類型。例如,一個返回Customer實體集合的查詢可以包含一個 PrivateSectorCustomer對象和PublicSectorCustomer對象。還可以指定一個只返回一個派生類型的查詢方法。下面示 例了返回不同類型的查詢方法。

爲 客戶端項目生成代碼
當生成解決方案時,在客戶端會爲已經在domain service中公開的繼承體系生成代碼。體系的根類被生成並派生於Entity類。每個派生的類都是生成和派生於根類。在DomainContext類 中,只生成一個Entity(TEntity)成員屬性,並且它需要根類型的對象。爲每一個查詢都生成了EntityQuery對象,它返回在 domain service操作中指定的類型。
下面示例了一個在客戶端爲查詢方法生成的簡單版本的代碼。它並沒有包含所有生成類中的代碼,只是 想強調一些重要的成員屬性和方法。
數 據修改
可以爲繼承體系中的更新、插入和刪除對象添加domain service方法。如同查詢方法,可以爲操作指定一個根類型或一個派生類型。然而,任何對派生類的更新、插入或刪除操作也都應該可以在根類型中執行。可 以在體系中爲任何類型添加named updat
方法。會爲在方法中指定的類型在客戶端生成相應的named update方法。
下面的 代碼示例了兩個更新方法和一個named update方法的簽名。
關 聯
可以在根類或派生類中定義關聯。我們在練歌數據類之間應用AssociationAttribute屬性來定義一個關聯。在 數據模型的例子中,在Customer和Order之間定義了一個關聯。如果對根類型應用了關聯,那麼所有的派生類型也包含這個關聯。
使 用繼承的基本規則


  • 僅對實體類型支持繼承,非實體類型被當做在domain service操作簽名中指定的類型。
  • 在domain service操作中的返回值和參數,不支持接口類型。
  • 在代 碼生成的時候必須知道繼承體系中的類型集。在生成代碼的時候沒有指定返回類型的行爲是未指明和實現相關的。
  • 允許對實體類型的公共成員屬 性或字段使用virtual或new。但在客戶端對應生成的實體類型中會被忽略。
  • 不允許對domain service操作方法重載。
  • 與 繼承相關的LINQ查詢功能不能用來運行domain service方法。特別地,不支持OfType>T<,is,as和GetType()操作符和方法。然而,在LINQ to Objects查詢中的EntitySet或EntityCollection(TEntity)上直接使用這些操作符。

實 體繼承體系

定義繼承體系使用下面的規則:

  • 使用 System.Runtime.Serialization.KnownTypeAttribute屬性來指定已知的類型。對RIA Services來說,需要使用包含一個System.Type參數並具有KnownTypeAttribute的構造函數。
  • 體系中的 已知類型,必須在domain service公開的體系中的根類型中指定。RIA Services 不支持在派生類型上聲明類型爲已知。
  • 每 個在已知類型集中的類都必須是public。
  • 在體系中的一個或多個類可以是abstract的。
  • 當聲明已知類型時, 可以在體系中省略一個或多個類。
  • 必須在根類中指定關鍵成員。
  • 關聯的聲明和使用是不可改變的。

DomainService 操作

在繼承體系中使用下面規則定義domain service 操作

  • 在體系中至少有一個對應 於根類型的查詢方法。其他的查詢操作可以使用派生類型作爲返回值。
  • 對返回多態結果的方法,查詢方法可以返回一個根類型。
  • 如 果對系統內的類型定義了更新、插入、或刪除操作,那麼對根類型也要定義相同的操作。不可能只對某些類型選擇操作。
  • 自定義操作可以使用根 類型或派生類型作爲實體參數。當實例的實際類型是從自定義操作中的類型派生的時候,操作是可行的。
  • DomainServiceDescription 類返回對給定類型最適用的更新、插入、刪除和查詢方法。

TpyeDescriptionProvider

下 面的規則應用於TypeDescriptionProvider(TDP)

  • 當體系中的根類型通過一個查詢方法或 IncludeAttribute屬性公開時,會對LINQ to SQL應用TpyeDescriptionProvider,並且實體框架會自動對實體使用KnownType屬性聲明。而對派生類型則不會如此。
  • 在Add New Domain Service Class對話框中不會提供任何繼承體系的功能。用戶可以在體系中選擇一些、全部或不選擇類型。

生 成的代碼

對體系中的實體,以下的規則應用於客戶端的生成代碼

  • 對每個繼承體系,只生成一個 EntitySet(TEntity)類。在已知的體系中EntitySet(TEntity)的類型參數是最基本的類型。
  • 對體系中每 個已知的類型,都對應生成一個實體類型。即使沒有domain service方法公開這個類型,這個實體類型也會生成。
  • 對指定的類型 可生成自定義方法,並這些方法可用於任何派生類型。
  • 構造函數是根據繼承體系來綁定的。每個類型都可以調用OnCreated方法並可以 自定義此方法。
  • 如果服務端的實體體系中的類被跳過,那麼在客戶端生成的實體體系中也會被跳過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章