剖析ADO.NET數(shù)據(jù)服務(wù)框架
ADO.NET數(shù)據(jù)服務(wù)框架還是比較常用的,于是我研究了一下ADO.NET數(shù)據(jù)服務(wù)框架,在這里拿出來和大家分享一下,希望對(duì)大家有用。在需要業(yè)務(wù)邏輯的情況下(例如實(shí)現(xiàn)驗(yàn)證邏輯或安全時(shí)),可以使用服務(wù)操作。服務(wù)操作允許開發(fā)人員在 URI 標(biāo)識(shí)的服務(wù)器(類似于其他 ADO.NET 數(shù)據(jù)服務(wù)資源)上定義一個(gè)方法。這些服務(wù)操作是一些添加到派生自表示數(shù)據(jù)服務(wù)的 DataService 的類的方法。
ADO.NET數(shù)據(jù)服務(wù)框架之創(chuàng)建服務(wù)操作
若要實(shí)現(xiàn)服務(wù)操作,請(qǐng)將一個(gè)公共實(shí)例方法定義為派生自表示數(shù)據(jù)服務(wù)的 DataService 類的數(shù)據(jù)服務(wù)類的一部分。
◆此方法只能接受 [in] 參數(shù)。
◆如果對(duì)參數(shù)進(jìn)行定義,則每個(gè)參數(shù)的類型必須為基元類型。
◆此方法必須返回 void、IEnumerable
◆T 必須為一個(gè)類,此類表示數(shù)據(jù)服務(wù)將公開的數(shù)據(jù)模型中的某個(gè)實(shí)體類型。
◆若要支持查詢選項(xiàng)(如排序、分頁和篩選),服務(wù)操作方法應(yīng)返回 IQueryable
◆必須用 [WebGet] 或 [WebInvoke] 屬性為此方法添加批注。
◆[WebGet] 使您能夠通過使用 GET 請(qǐng)求調(diào)用此方法。
◆[WebInvoke] 使您能夠通過使用 PUT、POST 或 DELETE 請(qǐng)求調(diào)用此方法。
#T#可以用 SingleResultAttribute 為服務(wù)操作添加批注,指定此方法的返回值是一個(gè)實(shí)體而不是一個(gè)實(shí)體集。這一區(qū)別確定了生成的響應(yīng)序列化。例如,當(dāng)使用 AtomPub 序列化時(shí),單個(gè)資源類型實(shí)例將表示為一個(gè) entry 元素,而單個(gè)實(shí)例集將表示為一個(gè) feed 元素。如果某個(gè)方法未遵循上面定義的約定,則不會(huì)將此方法公開為數(shù)據(jù)服務(wù)中的服務(wù)操作。對(duì)服務(wù)操作進(jìn)行尋址。
根據(jù) ADO.NET 數(shù)據(jù)服務(wù)協(xié)議規(guī)范,可通過將方法的名稱放置到 URI 的***個(gè)路徑段中來對(duì)服務(wù)操作進(jìn)行尋址。可以將其他路徑段或查詢選項(xiàng)添加到此 URI,具體取決于服務(wù)操作的返回類型。下面的示例對(duì)公開基于實(shí)體框架的模型的數(shù)據(jù)服務(wù)實(shí)現(xiàn)服務(wù)操作。
- public class Northwind :
- DataService<NorthwindModel.NorthwindEntities>
- {
- public static void InitializeService(IDataServiceConfiguration config)
- {
- // Entity sets access configuration.
- config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
- // Service operations access configuration.
- config.SetServiceOperationAccessRule("OrdersByCity",
- ServiceOperationRights.All);
- }
- [WebGet]
- public IQueryable<Orders> OrdersByCity(string city)
- {
- if (string.IsNullOrEmpty(city))
- {
- throw new ArgumentNullException("city",
- "You must provide a city name argument");
- }
- return this.CurrentDataSource.Orders.Where(
- "it.ShipCity = @city",
- new ObjectParameter("city", city));
- }
- }