艾伟:为什么微软要推 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

 

 

目录
相关文章
|
3月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
61 1
|
3月前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
68 3
|
3月前
|
机器学习/深度学习 编解码 算法
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
《nnU-Net: 自适应框架用于基于U-Net的医学图像分割》是一篇2018年的论文,发表在Nature上。该研究提出了一种自适应的医学图像分割框架nnU-Net,能够自动调整模型的超参数以适应不同的数据集。通过2D和3D U-Net及级联U-Net的组合,nnU-Net在10个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
111 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
5月前
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
166 2
|
5月前
|
开发框架 JSON 监控
实战指南:从 .NET Framework 迁移到 .NET 5/6 的策略与最佳实践
【8月更文挑战第28天】从 .NET Framework 迁移到 .NET 5/6 是一次重要的技术升级,涉及开发环境与应用架构的改进。本文通过具体案例分析,介绍迁移策略与最佳实践,帮助开发者顺利完成转变。
101 1
|
5月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
5月前
|
XML JSON 程序员
总结一下 .NET FrameWork 和 .NET Core 创建的项目的不同点
总结一下 .NET FrameWork 和 .NET Core 创建的项目的不同点
116 0
|
5月前
|
消息中间件 开发框架 .NET
闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
|
5月前
|
开发框架 前端开发 .NET
闲话 .NET(3):.NET Framework 的缺点
闲话 .NET(3):.NET Framework 的缺点