剖析ADO.NET數(shù)據(jù)服務(wù)框架
ADO.NET數(shù)據(jù)服務(wù)框架還是比較常用的,于是我研究了一下ADO.NET數(shù)據(jù)服務(wù)框架,在這里拿出來和大家分享一下,希望對大家有用。在需要業(yè)務(wù)邏輯的情況下(例如實現(xiàn)驗證邏輯或安全時),可以使用服務(wù)操作。服務(wù)操作允許開發(fā)人員在 URI 標識的服務(wù)器(類似于其他 ADO.NET 數(shù)據(jù)服務(wù)資源)上定義一個方法。這些服務(wù)操作是一些添加到派生自表示數(shù)據(jù)服務(wù)的 DataService 的類的方法。
ADO.NET數(shù)據(jù)服務(wù)框架之創(chuàng)建服務(wù)操作
若要實現(xiàn)服務(wù)操作,請將一個公共實例方法定義為派生自表示數(shù)據(jù)服務(wù)的 DataService 類的數(shù)據(jù)服務(wù)類的一部分。
◆此方法只能接受 [in] 參數(shù)。
◆如果對參數(shù)進行定義,則每個參數(shù)的類型必須為基元類型。
◆此方法必須返回 void、IEnumerable
◆T 必須為一個類,此類表示數(shù)據(jù)服務(wù)將公開的數(shù)據(jù)模型中的某個實體類型。
◆若要支持查詢選項(如排序、分頁和篩選),服務(wù)操作方法應(yīng)返回 IQueryable
◆必須用 [WebGet] 或 [WebInvoke] 屬性為此方法添加批注。
◆[WebGet] 使您能夠通過使用 GET 請求調(diào)用此方法。
◆[WebInvoke] 使您能夠通過使用 PUT、POST 或 DELETE 請求調(diào)用此方法。
#T#可以用 SingleResultAttribute 為服務(wù)操作添加批注,指定此方法的返回值是一個實體而不是一個實體集。這一區(qū)別確定了生成的響應(yīng)序列化。例如,當使用 AtomPub 序列化時,單個資源類型實例將表示為一個 entry 元素,而單個實例集將表示為一個 feed 元素。如果某個方法未遵循上面定義的約定,則不會將此方法公開為數(shù)據(jù)服務(wù)中的服務(wù)操作。對服務(wù)操作進行尋址。
根據(jù) ADO.NET 數(shù)據(jù)服務(wù)協(xié)議規(guī)范,可通過將方法的名稱放置到 URI 的***個路徑段中來對服務(wù)操作進行尋址??梢詫⑵渌窂蕉位虿樵冞x項添加到此 URI,具體取決于服務(wù)操作的返回類型。下面的示例對公開基于實體框架的模型的數(shù)據(jù)服務(wù)實現(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));
- }
- }