深入解析WPF编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1 .NET 3.0 Framework介绍

1.1 .NET 3.0 Framework介绍

2003年10月,在路易斯安那的微软2003 PDC(Professional Developers Conference,专业开发者大会)大会上,发布了Longhorn预览版、下一代API(称为WinFX)和下一代开发工具“Whidbey”。

“Longhorn”操作系统是一个重要的里程碑,它是第一个用托管代码构建的操作系统,它还是第一个支持自然搜索技术(Natural UI)的操作系统,这种技术自动解决了查询文本固有的大量多义性问题。Longhorn包含3大革命性的技术,第一是代号为“Avalon”的图形和展示引擎,第二是代号为“Indigo”的新的通信架构,第三是代号为“WinFS”的新的文件系统,这种最新的存储子系统是文件系统概念的一次革命,“Whidbey”则是在延续了Visual Studio 2003的基础上,开发了一些新的功能。

到当前为止(笔者写这本书的时候是2007年第三季度),“Longhorn”已经演化为2006年11月正式发布的Windows Vista操作系统,而服务器版本则使用“Longhorn Server”的代号继续开发。

2005年底,微软发布了3个重要的产品:SQL Server 2005、Visual Studio 2005和BizTalk 2006,“Whidbey”演化为Visual Studio 2005,主要的新功能包括新的Team Server和Visual Studio新版本(统称为Visual Studio Team System),提供了一些用于源代码控制、错误跟踪、应用程序建模和负载测试的新功能,其他功能包括:ASP.NET 2.0,从本质上改进了微软的Web编程框架,并引进一些新的Web内容管理和自定义功能;得到很大改进的Visual Basic开发环境支持“Edit-and-Continue”(动态修改被调试的代码);开发支持用于SQL Server 2005(代号为Yukon)的服务器端编程;Visual Studio Tools for Office支持开发基于Word和Excel的自定义解决方案。

2006年下半年,微软先后发布了Office 2007、Vista及.NET Framework 3.0,引入了大量新的开发技术和概念,如Open XML文档格式、VSTS架构。在.NET Framework 3.0中,开发代号为“Avalon”的图形展示引擎演化为Windows Presentation Foundation(WPF),针对网络服务的新产品的“Indigo”则演化为Windows Communication Foundation (WCF),.NET Framework 3.0还包括新的基于工作流的Windows Workflow Foundation (WF)。WinFX新API在.NET Framework 3.0上包括了这3个新组件,它的框架如图1-1所示。但在这3个重要组件发布的时候,我们使用的主流的开发工具还是Visual Studio 2005。为了让开发人员能够用Visual Studio 2005开发基于Windows Vista平台和Office 2007上的软件,微软又发布了多个插件和扩展包,添加了相应的项目模板和设计工具,如VSTO 2005 for Office 2007、VS Extension for WF、VS Extension for WPF、WCF、C# 3.0和LINQ CTP(Community Technology Preview,社区技术预览版),以及为了使VS 2005在Vista下工作的VS 2005 SP1 Update for Vista。

图1-1 WinFX框架

接下来微软会做什么呢?Visual Studio Code Name“Orcas”(目前正式称为Visual Studio 2008),该款产品用于Windows Vista和Office 2007编程,与之绑定的.NET Framework版本是3.5,3.5版本并没有重大的更新,而是对过去一段时间新技术的融合和总结。除了C#3.0、LINQ等“真正的”新东西外,它内置的AJAX、WF、WCF、WPF等都是比较成熟的技术,当然,.NET Framework 3.5并不是简单地将.NET Framework 3.0包含的WCF、WF等组件直接放进去,而是对它们进行了升级。比如,新增的Workflow Enabled Services支持在一个Workflow中直接调用WCF接口,或者将一个Workflow以WCF接口发布给其他应用服务。VS 2005和VS 2008的区别如图1-2所示。

图1-2 VS 2005和VS 2008的区别

VS 2008带来的好处包括多定向支持、允许构建针对多个.NET框架版本的应用。VS 2008包含一个显著改进的HTML Web设计器,该设计器提供了分割视图编辑、嵌套母板页,以及出色的CSS集成。.NET 3.5内置提供ASP.NET AJAX,还添加了支持WebPart的UpdatePanel,支持JSON的WCF,以及多个缺陷修补和性能改进等方面的新特性。VS 2008还对JavaScript和AJAX提供了以往没有的智能提示和语言调试功能。

CLR开发团队使.NET Framework 3.5中的垃圾收集变得更有效率,NGen(将.NET程序集编译成本机镜像缓存的工具)的内存消耗将更少、线程池性能将更高,BigInteger、HashSet等新的类型将被添加到Base Class Library中。

VS 2008将在2007年底推出,目前在微软的网站上已经有beta2版下载,网址为http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx。它不仅包含客户端的Visual Studio Team Suite,还包括服务器端的Team Foundation Server。可以选择下载可安装的版本(不能安装在Vista系统中),也可以选择下载VPC(Virtual PC虚拟机)镜像文件。另外,MSDN中还提供了Code Samples for WCF and WF“Orcas”February CTP下载,包含了不少“Orcas”版本的WCF、WF的PPT、示例和动手试验。大家看这本书的时候VS2008已经正式Release了。

微软的开发路线图如图1-3所示,目前微软正按部就班地开发新产品。

图1-3 微软开发路线图

1.1.1 Windows Presentation Foundation概述

Windows Presentation Foundation,简称WPF,其实是一套崭新的桌面API。近年来,微软已经开发出了众多的图形用户接口开发工具包用以创建桌面应用,如C/C++/Win32 API,VB 6,MFC等,这些GUI的API都提供了各自用以表现GUI应用程序基本元素的代码库,基本元素包括主窗体、对话框、控件、菜单系统,以及其他的一些必需元素。随着.NET平台的发布,凭借其简单而又非常强大的对象模型,Windows Form开发模型快速成为UI开发的首选。

虽然许多特色化的桌面应用已经通过使用Windows Form被成功地开发出来,但事实上现在的桌面开发编程模型非常不对称。简单地说,它们都不提供在创建特色化桌面应用程序时所需要的许多额外技术的直接支持。为了说明这一点,请回顾下在.NET 2.0下进行GUI开发的体会。.NET 2.0 Windows Forms应用程序必须引入来自多种不同API和对象模型的类型。虽然在使用这些不同种类的API时,在语法上比较相似,但应该承认每种技术都需要截然不同的思维方式。比如,使用DirectX创建三维动画时所需要的技巧,与显示一个用于获取用户输入的模式对话框时所需要的技巧完全不同。所以,一个.NET 2.0的软件开发人员要掌握每种API迥异的本质是非常困难的。

WPF正是本着这种需求(将前面提到的这些相互间没有关联的API融合成为一个单一的统一对象模型)而被开发出来的。这样,当需要创建一段三维动画时,就没有必要使用DirectX进行手工编程,因为这个功能已经被直接内嵌在WPF中了。新的.NET 3.0中的桌面开发模型包括控件、2D、3D、流媒体及PDF文档等。

除了将众多API统一在一个单一平台之下,我们还会注意到WPF的设计也是为了将Web开发技术中优秀的方面与桌面开发技术的优点结合起来。事实上,WPF开发小组是由微软Web开发人员、Windows Forms开发人员和Win32开发人员组成的。设想一下,如果将以Web为中心的编程模型与以桌面为中心的编程模型结合起来将会产生什么样的效果呢?

WPF最有特色的优点之一就是它提供了一种将Windows应用程序的外观、用户体验与驱动它们的编程逻辑清晰地相互分离的方法——XAML。XAML利用标记来定义一个应用程序的UI,这种标记(在理想状态下,将由那些有着艺术家思维方式的人利用专用的工具来创建)可以被连接到一个托管代码库,并通过它提供相应的功能。这种技术使创建一个桌面应用程序的过程看起来和创建一个ASP.NET程序一样,完全不需要考虑Web模型中种种固有的限制(状态管理、数据交互、组件交互等)。

WPF的另外一个特点就是标记语言所提供的灵活性。在XAML标记中,不仅可以定义简单的UI元素(按钮、网格、列表框等),而且还能定义复杂的动画、图形绘制,以及多媒体功能(如视频回放)。不仅如此,WPF元素还可以通过风格模板来加以修饰,这样就使界面能够独立于核心程序处理代码,用最少的变更来改变应用程序整体的外观和体验。

WPF已经经过了优化,使之可以更好地利用Windows Vista操作系统中支持的新的显示驱动模型。虽然WPF应用程序可以被开发并被部署到装有Windows XP(或者是Windows Server 2003)的机器上,但同样的程序运行在Vista下将会表现得更出色,特别是当其使用了动画/多媒体服务时。这是因为WPF的多种表现服务都是基于DirectX引擎之上的,使之可以有效地利用软、硬件环境进行展现。

WPF应用程序的行为在Vista下也更趋合理。如果一个图形密集的应用程序崩溃了,不会导致整个操作系统崩溃(蓝屏死机);而这个陷入错误中的程序也将被简单地终止。可能我们都知道,臭名昭著的蓝屏死机的最常见原因就是那些陷入错误中的显示驱动。值得庆幸的是,这个问题在Vista中已经近乎“彻底解决”了。

Windows Presentation Foundation(WPF)是一套崭新的用于创建桌面应用程序的API。除了前面探讨过的特点以外,WPF应用程序还包括以下的特点:

一些对放置操作和内容重定位提供完全支持的布局管理器。

使用增强型的数据绑定引擎,支持多种方式的内容间绑定。

内置风格引擎,允许你为一个WPF程序定义“主题”。

使用矢量图形,允许图像自动调整大小来适应应用程序界面所在屏幕的大小和分辨率。

支持与既有GUI模型(如Windows Forms,ActiveX及Win32 HWND)的互操作。

再次强调一下,请记住WPF应用程序并非只局限于Vista操作系统。WPF应用程序可以在Windows XP和Windows Server 2003下创建(并运行)。WPF的框架如图1-4所示。

图1-4 WPF的框架

1.1.2 Windows Communication Foundation概述

.NET 3.0带来了一种崭新的、专门用来构建分布式系统的API:Windows Communication Foundation(WCF)。与你过去可能使用过的其他分布式API有所不同,WCF提供了一种单一、统一的(并且是容易扩展的)模型来访问一些以前各种各样的远程技术。

Windows Communication Foundation(WCF)是一个崭新的分布式计算工具包,它将一些现有的分布式技术(COM+,.NET remoting,XML Web Services和微软消息队列服务(MSMQ))整合为一个紧凑高效的API。这样做的目的并不是因为在.NET开发中不能成功地使用上面提到的这几种技术,而是由于这其中任何一种API只是解决了分布式计算中的某一特定问题,而并没有提供一个单一的解决方案。比如,.NET remoting层允许多台计算机进行类型分发,但前提是它们都必须使用.NET Framework来构建;MSMQ可以很好地实现异步数据的交换,但每一台机器都需要安装微软的操作系统平台;XML Web服务允许各种不同的操作系统和编程架构之间进行相互操作,但如果并非所有软件开发商都在同一个标准上达成一致意见,数据的交换将会受到限制;COM+可以实现事务处理,但它不支持面向对象的开发,且部署和修改都很困难。

分布式技术种类之多使得我们很难从中找到合适的工具;而在它们所提供的服务中几种技术的交迭使用,又使得情况变得更加复杂。采用这样的应用,开发人员需要对所有的技术非常熟悉,但构建、维护和配置这样一个应用程序也是相当复杂的。

如何能够发挥这些技术的优点,又能够简单地进行配置、开发和维护呢?WCF为这些问题提供了一个非常全面的解决方案。从核心上来说,WCF构建于面向服务架构(SOA)成功的基础上。WCF编程API中使用到的许多术语和概念,都是与XML Web服务(如WSDL和SOAP消息)中的术语和概念直接(或类似)对应的。运行在不同的操作系统之上的.NET、J2EE和COM应用程序之间的互操作性将会变得很容易。WCF应用程序还借鉴了使用.NET remoting构建软件时用到的几个特点,如*.config文件、传输层和数据持久化的选择、特性的使用等。WCF如同一个黏合剂,将各种分布式开发技术黏合起来,如图1-5所示。

图1-5 WCF技术是连接各种分布式应用技术的黏合剂

然而,把WCF假定为仅仅是对旧有远程技术的包装,也不是十分准确。虽然WCF的确提供了一个用来访问各种远程计算技术的通用API,但是它也增加了一些必要的服务。例如,与简单的XML Web服务有所不同,WCF构建在最新且最优秀的行业标准之上,以此来描述许多重要的细节,比如安全性和事务的支持。另外,WCF被设计成可容易扩展的,这样,随着行业标准的发展和变化,WCF将可以灵活地去适应。同时,开发人员还可以扩展其核心结构、构建自定义绑定并且添加各种自定义侦听层。

不同API之间的互操作性和整合只是WCF中两个高级的方面。WCF提供了一个丰富的软件框架,实现了WCF所暴露的远程技术。请看下面的WCF核心服务列表:

支持强类型与非类型消息。这就允许.NET应用程序可以简单并且高效地共享自定义类型。与此同时,使用其他平台(如Java)创建的软件可以使用非强类型XML流。

支持多种终结点(endpoint)(原始HTTP,HTTP+SOAP,TCP,MSMQ和命名管道),这就允许你选择最合适的方式去传输和接收数据。

通过实现WS-AtomicTransaction(WS-AT)和WS-Coordination协议来支持分布式事务。

一个完全整合的安全模型,包括原生Win32/.NET安全协议和许多构建在Web服务标准之上的中性安全技术。

对象生命周期管理、分布式事务支持和发布/订阅事件(订阅在其他应用中发生),这些以前只是在COM+(也称作企业服务)中出现的服务,现在由WCF直接提供。

对消息队列(用在松耦合系统中)和用于确保消息分发的可靠会话数据协议的原生支持。

支持与会话类似的状态管理技术,以及支持单向无状态消息。

这些特性只是WCF所提供的功能的很小一部分。WCF的架构如图1-6所示。

图1-6 WCF的架构

1.1.3 Windows Workflow Foundation概述

.NET 3.0还有一个主要组件是Windows Workflow Foundation(WF)。这个API允许你对一个给定的应用程序内部使用的工作流(工作流可以看成是相关任务的集合)进行建模、配置和执行。WF现在提供的解决方案在建造生产性级别的软件时是很有用的,因为我们不再需要手工开发复杂的基础构件来支持工作流的应用。

任何现实世界的应用都必须能够模仿各种业务流程。简单地说,一个业务流程是对逻辑上作为一个整体协同工作的多个任务的概念上的集成。例如,假定你在构建一个允许用户在线购买汽车的应用,在用户提交订单后,很多活动开始运转。我们也许先从一个数据库事务开始,从一个库存表里除去一个记录项,在订单表里加一个订单记录,然后更新客户账号信息。在数据库事务完成之后,也许还需要给买车者发一个确认邮件,然后调用一个远程Web服务向代理商下订单。所有这些任务代表了一个业务流程。

业务流程建模是程序员需要应付的又一个细节,经常需要通过定制的代码来确保正确的业务流程建模,而且确保在应用本身内执行了。程序员需要编写额外的代码来对流程中出现的错误、跟踪和日志记录(查看特定业务流程的进行情况)支持、持久支持(保存长久运行的流程的状态),以及其他一些东西等。我们大概都有过亲身体验吧,在.NET 2.0上构建这种基础设施需要很多手工编码。

假设一个开发团队确实为他们的应用打造了一个定制的业务流程框架,他们的工作还没有完成。简单地说,将原生的C#代码库向开发团队里的那些也需要理解业务流程的非程序员解释起来并不容易。事实上,业务方面的专家、经理、销售人员和美工设计团队的成员并不懂代码的语言。鉴于这个事实,我们被要求利用建模工具(如微软的Visio),使用非技术性的中性术语,以图形的形式来表示流程。这里很明显的问题是,两个实体需要保持一致:如果改动了代码,则需要更新对应的图表;假如改动了图表,还需要更新产生图表的代码。

而且,使用代码的方式来构建一个复杂的软件应用时,在代码库里看不出应用内部流程的痕迹。例如,一个典型的.NET程序也许由成百上千个自定义类型组成,更不必说基础类库使用的种种类型了。尽管程序员对对象间是如何调用的有所了解,但代码本身与一个解释整个序列活动的文档还是相差很远。开发队伍也许会构建外部的文档和工作流程图,我们还是会遇上同个产品有多个表现形式的问题。随着.NET 3.0的发布,我们得到了一个崭新的Windows Workflow Foundation(WF)API。从本质上说,WF允许程序员用声明的方式通过使用预制的活动集来设计业务流程。这样,不用构建自定义的程序集来代表一个特定的业务活动和所需的基础设施,而是可以利用Visual Studio 2005“Orcas”的WF设计器在设计时创建我们的业务流程。WF允许我们构建一个业务流程的架构,然后通过代码来充实。

在用WF API编程时,可用单个文档来表示整个业务流程,以及定义这个流程的代码。因为单个WF文档除了提供业务流程的一个友好的视觉表示外,还可被用来表示驱动流程的代码,我们不再需要担心多个文档不同步的问题。WF文档能够清楚地图解说明流程本身。WF的架构如图1-7所示。

图1-7 WF的架构

1.1.4 CardSpace概述

在数字世界中建立身份认证是最普遍的行为,从一组用户名和密码到更精细的机制如硬件装置设备,这一过程实际上已经成为网络应用程序的自然而然的习惯操作。然而,身份认证技术本身却相当薄弱。因此,在身份认证领域最新推出了以Web服务为基础的来自微软的CardSpace。

在进一步深入了解CardSpace的细节之前,让我们回过头先回顾一下整个数字身份认证的概况。可以确定的是,绝大多数身份认证管理解决方案并没有缺点,如Open ID、Liberty Alliance、Windows Live ID(Passport)和Type Key。这些解决方案都是试图为最终用户提供某种方法,使用户可以在利用网络资源时不需要众多不同的用户名和密码,使用统一身份。为此,也欢迎第三方提供商将这些身份认证机制整合到网络应用程序之中,以方便用户注册。不过,尽管所有上述技术都经过大量宣传,不过仍有两方面因素制约着它们的使用:所有权设计和集中信息管理问题。

首先,就是为了使身份认证管理过程发挥作用,显然,我们需要双方在通信细节上达成共识。换句话说,就是从有效载荷参数(payload parameters)到实际请求顺序的任何事都应该按照标准方式进行。另一个限制这些身份认证机制的因素就是实际身份认证管理,因为许多请求的证书储存在远程服务器或中心服务器中,这就给最终用户造成不安,因为远程存储的用户名和密码非常不安全,最易被窃取。那么接下来,让我们看看CardSpace是如何解决这两个问题的。

CardSpace是建立在一系列Web服务协议基础之上的:Web服务安全技术(WS-Security)、Web服务信任技术(WS-Trust)、Web服务元数据交换技术(WS-MetadataExchange)和Web服务安全策略(WS-SecurityPolicy)。这就支持CardSpace根据使用协议执行身份认证处理程序。不是低估任何其他技术,而是得到广泛行业认证支持的这些协议足以将CardSpace推广给广泛的用户。另外,CardSpace被设计为客户范围的技术,也就是一台用户个人计算机配置一个Windows CardSpace,让用户自己管理证书,使被窃指数降至最低。

了解了Windows CardSpace的背景信息之后,让我们看一下进行身份认证管理的过程:某个最终用户通过Windows CardSpace在网站上验证身份。首先我们要看一下网站是如何将身份认证请求添加整合到网页之中的,如代码1-1所示。

代码1-1 CardSpace身份认证需求表单

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
  <title>Card Space Login </title>
</head>
<body>
    <form method="post" action="login.aspx">
      <button type="submit">Submit your Information Card</button>
      <object type="application/x-informationcard" name="xmlToken">
        <param name="tokenType" value="urnasis:names:tc:SAML:1.0:assertion" />
        <param name="issuer"
            value="http://schemas.microsoft.com/ws/2005/05/identity/issuer/self"/>
          <param name="requiredClaims"
            value="http://schemas.microsoft.com/ws/2005/05/identity/claims/givenname
                http://schemas.microsoft.com/ws/2005/05/identity/claims/surname
                http://schemas.microsoft.com/ws/2005/05/identity/claims/emailad
                        dress
                http://schemas.microsoft.com/ws/2005/05/identity/claims/private
                        personalidentifier"/>
      </object>
    </form>
</body>
</html>

使CardSpace优于早先HTML表单的就是带有属性type=application/x信息卡的<object>标记——该结构可以说明CardSpace请求。在每一系列<param>标记中嵌入这个相同的元素,每个标签用来详细说明一个必需的身份值。以这种特殊的表单,我们可以观察安全声明标记语言(Security Assertion Markup Language,SAML)令牌的使用——一个XML标准,提供了一个健壮且可扩展的数据格式集,在各种环境下交换数据和身份识别信息,以及5个相关语句/命名空间(namespace)用来赋予名、姓、电子邮件地址和个人标识符。当这种特殊表单到达启用CardSpace的个人计算机时,用户就会被提示通过某个CardSpace身份批准当前的数据请求,这样用户就可以接受或拒绝给网站发送这样的信息。当然,对CardSpace的身份认证过程也有许多分歧,所以接下来让我们看一下这些问题。

也许使用CardSpace的最大好处就是最终用户可以完全控制他或她的身份,每个令牌可以存储所有信息,包括姓名、密码、信用卡号码、社会保障号及其他所有身份认证信息。但毕竟,让最终用户逐个提交这些身份信息的基础是看谁是请求者。

而服务提供商使用CardSpace也有不少好处。因为每个CardSpace身份都是以Web服务协议为基础的,这就是说任何以这些Web服务协议为基础的网络应用程序都能够请求和使用这些令牌来验证身份,这样就有效地打破了那些正确操作“X”语言或“Y”平台等繁复的身份验证解决方案。

现在,留心的技术学习者一定注意到我们先前提出的假设:那就是个人计算机和浏览器将装配CardSpace。所以,为了揭开这个假设,让我们来谈谈CardSpace如何适用于更多情况。

CardSpace是.NET 3.0(不断发展的微软应用程序开发平台,目前广泛使用的是.NET 2.0版本)中的一个组件。CardSpace建立在Windows通讯基础(Windows Communication Foundation,WCF)、Windows工作流基础(Windows Workflow Foundation,WF)和Windows表现基础(Windows Presentation Foundation,WPF)之上,同时由于CardSpace承担了身份验证应用程序的大部分工作量,所以以上两方面因素构成了今后开发启用Web服务应用程序的基础。关于三大基础你可以参看本章1.1.1节至1.1.3节。

目前,我们最关心的还是CardSpace的采用率,目前,最新版本的Internet Explore(r IE) 7.0已经发布,它支持CardSpace技术。不过,Windows Vista——微软最新操作系统的发布大大推动了CardSpace技术的采用,Windows Vista不仅默认使用Internet Explorer(IE)7.0,同时装配有完整的.NET 3.0组件。

1.1.5 C# 3.0和LINQ技术概述

作为微软即将发布的.NET旗舰编程语言,C# 3.0引入了大量的新语法模式,包括隐式数据类型化、扩展方法、对象初始化器、匿名类型和lambda表达式。这些新语言特性不但可以用于帮助构建健壮的、功能强大的.NET软件,还可以在和LINQ技术集进行互操作时发挥重要作用。有关C#3.0的新特性在本书配套光盘中有一个PDF文件会做详细阐述。

LINQ有两项主要的相关应用技术:LINQ到SQL(原称为DLINQ)和LINQ到XML (原称为XLINQ)。使用查询运算符查询表达式的作用,可以定义语句来对数据源进行查询,获取所请求的结果集。LINQ可以和包含在集合类型、关系数据库及XML文档里的数据做交互。

作为软件开发人员,我们很大部分的编程时间都是花在获取和操作数据上的。说到“数据”,大概就会不假思索地想到包含在关系数据库里的信息。另一个很流行的数据格式是XML文档,如*.config文件、保存在本地的DataSet、从XML Web服务返回的内存中的数据等。

除了这两个常见的数据来源之外,还能在许多地方找到数据。例如,比方说你有个List<>泛型,内含300个整数,你要获取满足某个给定条件(如奇数或偶数)的子集;或者,你也许要利用反射API,从一个Type数组中得到从一个特定父类继承而来的每个类型的元数据描述等。显而易见,数据随处可见。

在.NET 2.0中与特定类型的数据打交道时,要求我们作为程序员使用特定命名空间下的特定类型。比如,考虑一下表1-1。

表1-1 操作各种数据的方式

当然,使用这些操作数据的方式是一点问题也没有的。实际上,在用.NET 3.0/C# 3.0编程时,你肯定会直接使用ADO.NET、XML命名空间、反射服务及各种集合类型。但是,基本的问题在于,这些API的每一种本身都像是一座孤岛,只提供极少的集成方式。当然你可以把ADO.NET DataSet保存成XML,然后通过System.Xml命名空间来操作。但是,至少目前的数据操作依然还是非常不方便的。

语言级集成查询(LINQ)项目意图提供一种统一的和对称的方式,让程序员在广义的数据角度上得到和操作“数据”。通过使用LINQ,我们能够在C#编程语言内直接创建被称为查询表达式(query expressions)的实体。这些查询表达式是基于许多查询运算符(query operators)的,而且是有意设计成类似SQL表达式的。

但不同之处在于,查询表达式可以被用来与许多种数据做交互,即使是那些与关系数据库毫无关系的数据。具体来说,LINQ允许查询表达式以统一的方式来操作任何实现了IEnumerable<T>接口的对象、关系数据库或者XML文档。

需要特别指出的是,LINQ查询表达式,跟传统的SQL语句有所不同,是强类型的。所以,C#编译器会让我们老老实实地保证这些表达式在语法上是合法的。另一个相关的要点是,查询表达式利用它们的程序集中拥有对应的元数据表示。像Visual Studio 2005这样的工具,可以使用这个元数据来提供像IntelliSense(智能提示)、自动完成等有用的特性。

在深入探究LINQ的细节之前,最后需要指出的一点是,LINQ是设计为一个可扩展的技术的。虽然这个早期的LINQ版本是针对关系数据库、XML文档和实现了IEnumerable<T>的对象的,但第三方供应商针对额外的数据类型,可以通过扩展方法融入新的查询运算符,或者重新定义现有的运算符。

有关LINQ技术的讨论可以单独写一本书了,在CSDN论坛上甚至有网友把它称之为“二十一世纪最伟大的发明之一”,也许有些过了,但LINQ带给我们的技术革命是毋庸置疑的。