瞬間明白ADO.NET數(shù)據(jù)服務(wù)是怎么回事
ADO.NET還是比較常用的,于是我研究了一下ADO.NET數(shù)據(jù)服務(wù),在這里拿出來(lái)和大家分享一下,希望對(duì)大家有用。ADO.NET數(shù)據(jù)服務(wù)框架支持具象狀態(tài)傳輸 (REST) 語(yǔ)義以外的功能。例如,服務(wù)操作和偵聽(tīng)器可用于將驗(yàn)證邏輯或安全過(guò)程添加到查詢(xún)和更新中。可以使用 ADO.NET 數(shù)據(jù)服務(wù)定義的標(biāo)準(zhǔn)語(yǔ)法寫(xiě)入服務(wù)操作以對(duì)輸出進(jìn)行篩選或排序。以上示例的查詢(xún)字符串中使用了排序語(yǔ)法,其中的 $orderby 和 $top 運(yùn)算符應(yīng)用于操作結(jié)果。
利用偵聽(tīng)器可以將自定義應(yīng)用程序邏輯插入到數(shù)據(jù)服務(wù)的請(qǐng)求或響應(yīng)過(guò)程中。必須為由數(shù)據(jù)服務(wù)公開(kāi)的給定實(shí)體集顯式注冊(cè)偵聽(tīng)器方法。在指定的實(shí)體集上執(zhí)行查詢(xún)、插入、更新或刪除操作時(shí),將調(diào)用相應(yīng)的偵聽(tīng)器。然后,偵聽(tīng)器可能會(huì)更改數(shù)據(jù)、執(zhí)行授權(quán)策略或者甚至終止操作。
#T#ADO.NET數(shù)據(jù)服務(wù)也支持由關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)現(xiàn)的存儲(chǔ)過(guò)程。實(shí)體數(shù)據(jù)模型 支持將數(shù)據(jù)檢索和修改映射到存儲(chǔ)過(guò)程。ADO.NET 數(shù)據(jù)服務(wù)對(duì)此功能進(jìn)行了改編。服務(wù)操作的服務(wù)范圍可見(jiàn)性由某個(gè)方法控制,其方式與實(shí)體集可見(jiàn)性的控制方式大致相同。例如,若要使上述示例中的 CustomersByCity 方法可供訪問(wèn),請(qǐng)將下圖中的代碼添加到派生自 DataService 的類(lèi)。
- public class Northwind : DataService<NorthwindEntities>
- {
- public static void InitializeService(
- IDataServiceConfiguration config)
- {
- config.SetServiceOperationAccessRule("CustomersByCity",
- ServiceOperationRights.All);
- }
- [WebGet]
- public IQueryable<Customer> CustomersByCity(string city)
- {…
- }
- }
偵聽(tīng)器
利用 ADO.NET數(shù)據(jù)服務(wù),數(shù)據(jù)服務(wù)開(kāi)發(fā)人員能夠截獲請(qǐng)求/響應(yīng)管道并注入自定義驗(yàn)證邏輯。在 ADO.NET數(shù)據(jù)服務(wù)中,偵聽(tīng)器具有兩大作用:使您能夠向處理管道添加驗(yàn)證邏輯;提供一個(gè)用于在每個(gè)請(qǐng)求中插入自定義身份驗(yàn)證策略的場(chǎng)所。查詢(xún)偵聽(tīng)器不能采用參數(shù)。
請(qǐng)求/URI 處理
當(dāng)數(shù)據(jù)服務(wù)接收到 GET 請(qǐng)求時(shí),將處理請(qǐng)求 URI 并調(diào)用數(shù)據(jù)服務(wù)上定義的任何查詢(xún)截獲方法。下面的示例演示查詢(xún)偵聽(tīng)器方法的實(shí)現(xiàn),此方法可截獲針對(duì)訂單的 GET 請(qǐng)求。此偵聽(tīng)器僅返回分配給滿(mǎn)足 CustomerID=="AROUT" 條件的客戶(hù)的訂單。若要對(duì)發(fā)送請(qǐng)求的用戶(hù)進(jìn)行身份驗(yàn)證,以便此方法將返回分配給每個(gè)用戶(hù)的訂單,則需要更多代碼。
[QueryInterceptor("Orders")]
public Expression<Func<Orders, bool>> FilterOrdersByCustomer()
{
return o => o.Customers.CustomerID == "AROUT";
}