开发者社区> 狼人2007> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

艾伟:为什么微软要推 ADO.NET Data Services Framework

简介:   微软在 .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 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

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Flink / Scala - java.lang.NumberFormatException: Not a version: 9
Flink V1.13.1 +Scala 2.11.8 提交任务后,报错Caused by: org.apache.flink.shaded.guava18.com.google.common.util.concurrent.UncheckedExecutionException: java.lang.NumberFormatException: Not a version: 9 ,遂排查与解决。
38 0
Java+Springboot+Mybatis+Mysql+Bootstrap+Maven实现景区旅游管理系统(上)
Java+Springboot+Mybatis+Mysql+Bootstrap+Maven实现景区旅游管理系统
136 0
.Net Micro Framework研究—模拟器直接运行MF程序
既然VS2005能启动运行,我想我们也可以,唯一不同的是模拟器加载的参数不同而已
586 0
.NET Micro Framework 4.2 beta 源码探析
这个版本主要的改变就是支持远程安全升级,VB.net 程序开发,PWM和AD。
548 0
.NET Micro Framework 4.2 beta 源码探析
        .NET Micro Framework 4.2 beta发布已经有一段时间了,一直没有腾出时间研究,昨天因为LWIP协议栈的原因(感觉上一个版本有点问题)刚 下了代码,所以抽空研究了一下。
763 0
.Net Micro Framework研究—模拟器直接运行MF程序
      上次用MF做了一个Windows桌面,感觉还不错,所以就想做一做如俄罗斯方块、贪吃蛇之类的小游戏,不过每次用模拟器运行MF程序,都需要打开VS2005的源码程序,然后单击启动。
471 0
.Net Micro Framework研究—带AD的模拟器
  继昨天的研究,希望再接再厉把AD模入模出在模拟器上也实现出来,本以为挺简单,其实AD相关功能,与GPIO不同,在模拟器中前者通过GpioPort实现,后者通过SpiDevice实现。
471 0
+关注
狼人2007
个人对技术的追求:代码少而精捍;思路清晰美观;可扩展好维护;技术驱动商业; 人生格言:只要你有信念,有追求,并且坚持,那你一定比随波逐流,行得远行得正...
文章
问答
文章排行榜
最热
最新
相关电子书
更多
FLowFuzz A Framework
立即下载
《Visual Edge Computing Service视图计算产品发布介绍》PDF
立即下载
低代码开发师(初级)实战教程
立即下载