爲什麼微軟要推 ADO.NET Data Services Framework 轉自 博客園 WizardWu

微軟在 .NET 3.5 SP1 平臺上,推了一組新的數據訪問 Framework,叫做 ADO.NET Data Services。微軟怕程序員太閒嗎?爲什麼要創造 ADO.NET Data Services?Web Service 和 WCF 不就很好用了嗎?本帖整理一些研討會及網絡上大內高手的觀點,並提供一個可在 VS 2008 SP1 上執行的示例給大家下載參考;但本帖不提供 step by step 實作教學,因爲網絡上已經有一堆這種文章了 (參考本帖最下面的「參考文件」第 6、第 7 點的文章,照着用 VS 2008 + SP1 操作,即可達成本帖提供下載的示例)。

.NET 的 WCF 3.5,有一個很重要的新功能,是對 REST (Representational State Transfer) 的支持。聽說一些知名大型網站,及 RoR 陣營,都開始逐漸拋棄 Web Service,改提供 REST 的服務。所以微軟這邊也不能閒着,也搞了一套 ADO.NET Data Services 來支持 REST 的概念。

所謂的 REST,如同字面上的意思,是要讓開發人員和應用程序 (當然也包括異質平臺的應用程序),能以簡單到不能再簡單的方式,去訪問和擷取網絡上的數據和資源。怎麼個簡單法?REST 用最單純的 URL 網址,就讓一般客戶、應用程序能直接訪問、寫入遠程主機上的數據庫。此外,微軟實作 REST 的 ADO.NET Data Services,亦有一套安全控管、存取權限控管的機制,不必擔心安全性的問題。

相對於微軟的 WCF Service 要做一些設定,以及過去大家常用的 Web Service,此二者和 REST、ADO.NET Data Services 比較起來,相對就顯得較複雜、不夠彈性,且 Web Service 還有最爲人垢病的 performance 問題。

過去如果你是一間公司的 MIS,當 A 部門的員工需要某些數據,你可能會隨手寫一支 Web Service 開放這些數據給別人使用;過不久 B 部門的主管又需要別的數據,你可能就再寫另一支 Web Service,開放另一臺主機數據庫中的數據給別人使用。日積月累下來,幾十上百支的 Web Service 可能就難以維護和管理,如此做法就顯得不夠彈性。而且別人在呼叫這些 Web Service 時,必須先知道主機的位置、函數的名稱及功能、傳入的參數及類型,在引用上仍不夠方便。

但若透過 REST、ADO.NET Data Services,當你想公開某一臺主機上的數據庫 Northwind,給遠程的一般 user、開發人員或應用程序訪問 (包括 SELECT、INSERT、UPDATE、DELETE 等 CRUD 動作) 時,只要提供下列的 URL,搭配 HTTP Verbs (GET, POST, ...) 即可:
http://www.網站名稱.com/Northwind

若要讓他們能訪問 Northwind 數據庫中的 Products 表時,只要提供下列的 URL 即可:
http://www.網站名稱.com/Northwind/Products

亦即 ADO.NET Data Services 是一個遠程主機數據訪問的「中介服務」,可由客戶端、客戶端應用程序,自行決定數據存取的內容和方式。

因此將來的 URL 指向的不再只是一個網址,而可能是某個數據庫、數據來源、雲端運算 [15,16,17];而且分佈式環境中的 AJAX、WCF、Silverlight 等客戶端應用程序,要使用這個 REST-based 服務也相當簡單,尤其是 AJAX 不用再手工搞一堆 JavaScript;將來要在異質系統之間交換數據,將會有比 Web Service 更方便、更好用的選擇,苦命的程序員將來或許真的能 REST 了 (雖然實際上只是夢想)。

在 .NET 平臺方面,未來的 .NET Framework 4.0 及 Visual Studio 2010,仍有 ADO.NET Data Services Framework 2.0 的版本,也有新的 4.0 版的 System.Data.Services 函式庫,因此預估 ADO.NET Data Services 將來應不至於被微軟淘汰,程序員可放心學習。


-------------------------------------------------
本帖的示例代碼下載點:
http://files.cnblogs.com/WizardWu/081214.zip

(執行本示例,需要 VS 2008 + SP1,以及 SQL Server 的 Northwind 數據庫。若無法執行,請在本帖留言告知)
-------------------------------------------------

此一示例,是參考本帖最下方「參考文件」的第 6、第 7 這兩篇文章的教學實作出來的,在此不再贅述過程。下載代碼後,直接雙擊 testDS.sln,即會以 VS 2008 (SP1) 開啓兩個 project,如下圖 1 所示。

2008121323341292.jpg
圖 1 鼠標指的 WebDataService.svc,即爲開放在 URL 中給所有客戶引用的 Data Services 服務


圖 1 下方的 ds_server 項目,即爲提供服務的 ADO.NET Data Services,透過一個 O/R Mapping 的 EDM 檔案 [2],以和 ADO.NET Entity Framework 同樣的做法,提供客戶走訪整個 SQL Server 2005 的 Northwind 數據庫。

如同 WCF,在 ADO.NET Data Services 中也以 .svc 格式的檔案提供網絡上的服務。請您如上圖 1,在 VS 2008 中,以鼠標右鍵,透過瀏覽器直接開啓 WebDataService.svc 檔案,此時您應該會看到如下圖 2 的畫面,亦即列出 Northwind 數據庫中所有的表名稱。

2008121323352982.jpg
圖 2 ADO.NET Data Services 默認會以 XML / Atom 格式回傳所有的數據


假設您開啓的網址如下:
http://localhost:埠號/ds_server/WebDataService.svc/

此時,只要在後面再加上表名稱,即可 SELECT 出該表的所有內容。如下列語法,即爲擷取出整個 Products 表的內容,並以 XML / Atom 格式回傳:
http://localhost:埠號/ds_server/WebDataService.svc/Products

若您在 IE 中看不到上圖 2 的內容,是因爲以 Atom 格式回傳,瀏覽器會自動進行格式化處理。請如下圖 3 (以 IE 7.0 爲例),關閉瀏覽器中的自動格式化動作,再按 F5 重新整理網頁:

2008121323360725.jpg
圖 3 在 IE 7 中,取消勾選「啓動摘要讀取檢視」


接下來您 (以及所有的客戶端、客戶端程序),即可直接透過此網址,去執行各種 ADO.NET Data Services 查詢語法。例如下列語法,是要取出該表中的第一筆記錄:
http://localhost:1056/ds_server/WebDataService.svc/Products(1)

下列語法,是隻要取出該筆記錄的 ProductName 字段存儲值 (經版工測試,在 Firefox 3.x 上亦可執行):
http://localhost:1056/ds_server/WebDataService.svc/Products(1)/ProductName

下列語法,可查出 Orders 表中,CustomerID 爲「ALFKI」的所有訂單數據:
http://localhost:1056/ds_server/WebDataService.svc/Customers('ALFKI')/Orders
結果會查出六筆記錄。其語法等同於:
SELECT * FROM Orders WHERE CustomerID='ALFKI'

當然您還可下各種參數,如:top、orderby、filter(大於、小於、等於、不等於)、skip、expand 等等。如下列語法,可取出該表中 top 20 筆的數據:
http://localhost:1056/ds_server/WebDataService.svc/Products?$top=20

當然您也可用一些邏輯算符、數學算符,以及 CURD 的操作,但目前不支持 sum、min、max、avg 函數,不支持 aggregate function 和 ISNULL、COALESCE 算符,但它自有一種 NULL 比對的語法,如下列語法,爲取出 Products 表中,所有 UnitPrice 字段其內容不爲 NULL 的記錄:
http://localhost:1056/ds_server/WebDataService.svc/Products?$filter=UnitPrice ne null

有關其語法細節,有興趣的網友們可參考本帖下方的參考文件 [11],以及網絡上的文件。此外,ADO.NET Data Services 自有一套安全控管機制,例如只有某些賬號能擷取某些表,某個羣組的用戶纔有寫入數據庫的權限,程序員不必擔心安全性的問題。


接下來要提到,若此 Data Services 要給客戶端使用,您當然不可能丟一個 URL 叫他自己去下查詢語法,因此各個程序員必須撰寫客戶端程序,去呼叫這個 Service。請您參考本帖先前的圖 1,在 VS 2008 中,將上方的 ds_client 項目設定爲「啓始項目」;接着檢視該項目中 Program.cs 其代碼,如下圖 4,將其中 localhost 後面的 port number,改成您先前用瀏覽器執行 WebDataService.svc 時,VS 2008 中虛擬 Web server 隨機給的埠號;改完後存儲,再按 F5 直接執行 ds_client 項目,即會看到圖 4 右下方的 console mode 執行畫面,會先引用 ds_server 項目中的 WebDataService.svc 服務,再用 C# 3.0 的 LINQ 去訪問 Products 表,並列出其中兩個字段的內容值。

2008121323371265.jpg
圖 4 透過 LINQ 及 EDM 做 O/R Mapping,客戶端程序及程序員無須知道後端數據庫位於何處,以及 SQL 語句該如何撰寫

 

結論:

如同本帖的標題,爲什麼微軟要創造 ADO.NET Data Services Framework?這門技術和 REST 的觀念,是爲了「簡化」程序員的工作,在分佈式環境或異質平臺上做數據交換時,只要透過既有的 HTTP protocol 和 URIs 網址,就能提供比 Web Service 更簡易的遠程程序調用能力。且 ASP.NET AJAX 4.0、Silverlight 2.0、VS 2010 都已內建支持 ADO.NET Data Services,甚至微軟將來的「雲端服務 (Azure Service)」也支持該服務。或許未來微軟要進一步拓展其野心,會叫各企業將其應用系統,都儘量由微軟代管,經由雲端服務 + Data Services 讓企業用戶覺得方便又省錢,也因此各大企業及 IT 從業人員,日後也更難脫離微軟帝國的掌控。

發佈了22 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章