為什么微軟要推 ADO.NET Data Services Framework

作者: WizardWu  來源: 博客園  發布時間: 2008-12-14 16:40  閱讀: 1227 次  推薦: 0   原文鏈接   [收藏]  

  微軟在 .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 所示。


圖 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 數據庫中所有的表名稱。


圖 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 重新整理網頁:


圖 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 表,并列出其中兩個字段的內容值。


圖 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 從業人員,日后也更難脫離微軟帝國的掌控。

------------------------------------------------------------

參考文件:

(1) ADO.NET 數據服務框架 (msdn)
http://msdn.microsoft.com/zh-cn/library/cc668792.aspx

(2) EDM 實體數據模型 (msdn)
http://msdn.microsoft.com/zh-cn/library/bb387122.aspx

(3) ADO.NET Data Services Framework 研討會 (繁體中文)
http://blog.sina.com.tw/dotnet/article.php?pbgid=4907&entryid=580166

(4) REST 一下吧~ 從 Web Service 到 RESTful WCF 的心情 (繁體中文)
http://studyhost.blogspot.com/2008/11/rest.html

(5) 以 WCF 來開發 RESTful 風格的服務 (繁體中文)
http://studyhost.blogspot.com/2008/11/wcfrestful.html

(6) .Net Magazine 國際中文電子版, 2008 年 10 月號 (繁體中文)
http://www.netmag.com.tw/

(7) ADO.NET DATA Services 實驗測試 (繁體中文)
http://blog.yam.com/kaizan/article/17120397

(8) Getting Started with ADO.NET Data Services (英文)
http://codebetter.com/blogs/david.hayden/archive/2008/01/08/getting-started-with-ado-net-data-services.aspx

(9) 一步一步學 Silverlight:數據與通信之 ADO.NET Data Services
http://kb.cnblogs.com/page/42890/

(10) 使用 ADO.NET Data Service (Astoria) 進行數據 CRUD 操作
http://www.cnblogs.com/lyj/archive/2008/04/11/1149136.html

------------------------------------------------------------

相關文件:

(11) 使用統一的 URI 對數據進行尋址的簡單方案(ADO.NET 數據服務框架)
http://msdn.microsoft.com/zh-cn/library/cc668786.aspx

(12) System.Data.Services.Client 命名空間 (msdn)
http://msdn.microsoft.com/zh-cn/library/system.data.services.client.aspx
http://msdn.microsoft.com/zh-cn/library/system.data.services.aspx

(13) RESTful .NET
http://oreilly.com/catalog/9780596519209/

(14) Representational State Transfer (REST)
http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

(15) 漫談云端運算 (繁體中文)
http://jerrylovesrebol.blogspot.com/2008/12/blog-post_02.html

(16) 云端運算世代下的 Visual Studio 2010 與 .NET Framework 4.0 概觀 (繁體中文)
http://blog.sina.com.tw/dotnet/article.php?pbgid=4907&entryid=580518

(17) 微軟 Azure 云端服務平臺 I - 檢視 Azure 云端服務所帶來的利益 (繁體中文)
http://blog.sina.com.tw/dotnet/article.php?pbgid=4907&entryid=580717

 

 

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()