全面迎接.Net3.0时代的到来(WCF/WF/WPF/LINQ)
.Net3.0从2006年发布预览版到今天(最高版本已经达到.Net3.5了),已经日趋稳定,.Net2.0做为3.0/3.5的一个子集继续被支持,但3.0又引入了很多激动人心的新特性(虽然这些特性在业内早已在其它说来语言上实现,但MS的优势在于,将别人的优势融入自己的产品体系后,将变得更强大优秀)
这里介绍几个部分新特性:
(一).LINQ的支持
经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段。程序员现在都已经认同像 类(classes)、对象(objects)、方法(methods)这样的语言特性。考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据( accessing and integrating information )的复杂度的问题。其中两个最主要访问的数据源与数据库( database )和 XML 相关。
LINQ 提供了一条更常规的途径即给 .Net Framework 添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query (LINQ) 。
包含 DLinq 和 XLinq
语法实例
C#3.0 LINQ 查询语法
首先来看一个很简单的LINQ查询例子,查询一个int 数组中小于5的数字,并按照大小顺序排列:
class Program
{
static void Main(string[] args)
{
int[] arr = new int[] { 8, 5, 89, 3, 56, 4, 1, 58 };
var m = from n in arr where n < 5 orderby n select n;
foreach (var n in m)
{
Console.WriteLine(n);
}
Console.ReadLine();
}
}
上述代码除了LINQ查询语法外,其他都是我们所熟悉的语法,而LINQ查询语法跟SQL查询语法很相识,除了先后顺序。
Q:为何 LINQ 查询语法是以 from 关键字开头的,而不是以 select 关键字开头的?select 开头这种写法跟SQL的写法更接近,更易懂呀?
A:简单来说,为了IDE的智能感知(Intelisence)这个功能,select 关键字放在后面了。
编程语言以 select 开头写LINQ查询语法不是没出现过,你如果使用过2005年的VB9 CTP 版本,那时候VB9的LINQ查询语法就是 select 关键字在前面,但是 select 关键字在前面,在做智能感知(Intelisence)时候就很头大。经过微软IDE组的权衡,确定了把 from 关键字放在最前面。
比如:你看 http://blog.joycode.com/saucer/archive/2005/09/16/63513.aspx 这篇博客,那时候 VB9 LINQ的查询语法还是 select 参数在最前面。不过后来 VB9 测试版改成了跟 C# 一样的做法, from 关键字放在最前面了。
更详细的解释,来自装配脑袋
假设你要书写这样的代码:Select p.Name, p.Age From p In persons Where xxx ,代码是一个个字符输入的。
我们在写到 p in persons 之前,p 的类型是无法推测的,所以写 Select p. 的时候,Name之类的属性不会弹出智能提示来。
这样就需要先去写 From 这句,再回来写 Select。
微软IDE组经过反复考虑决定,还不如就把 Select 写到后面了。于是编程语言中的写法就确定这样来写了。
VB9 的这个变化可以参看这篇博客:
Select/From vs. From/Select revisited...
我们再来看一个稍稍复杂的LINQ查询:
在我们罗列的语言字符串中,我们希望按照字符长短,分类罗列出来,实现代码如下:
static void Main(string[] args)
{
string [] languages = {"Java","C#","C++","Delphi","VB.net","VC.net","C++ Builder","Kylix","Perl","Python"};
var query = from item in languages
orderby item
group item by item.Length into lengthGroups
orderby lengthGroups.Key descending
select lengthGroups;
foreach (var item in query)
{
Console.WriteLine("strings of length ",item.Key);
foreach (var val in item)
{
Console.WriteLine(val);
}
}
Console.ReadLine();
}
其中的 into 关键字表示 将前一个查询的结果视为后续查询的生成器,这里是跟 group by 一起使用的。
LINQ中的Group by不要跟 SQL 中的Group by 混淆,SQL 由于是二维结构,Group by 的一些逻辑受二维结构的约束,无法象 LINQ 中的Group by 这么灵活。
Linq的内部执行原理浅析
LINQ(Language Integrated Query)是Visual Studio 2008中的领军人物。借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据。目前为止LINQ所支持的数据源有SQL Server、XML以及内存中的数据集合。开发人员也可以使用其提供的扩展框架添加更多的数据源,例如MySQL、Amazon甚至是Google Desktop。
一般来讲,这类查询语句的一个重要特点就是可以并行化执行。虽然有些情况下并行可能会带来一些问题,但这种情况非常少见。这样也就水到渠成地引出了PLINQ这个并行处理的LINQ类库。
PLINQ原名为Parallel LINQ,支持XML和内存中的数据集合。执行于远程服务器上的查询语句(例如LINQ to SQL)显然无法实现这个功能。
将LINQ语句转换为PLINQ语句极为简单——只需要在查询语句中From子句所指定的数据源的最后添加.AsParallel()即可。随后Where、OrderBy和Select子句将自动改为调用这个并行的LINQ版本。
据MSDN Magazine介绍,PLINQ可以以三种方式执行。第一种是管道处理:一个线程用来读取数据源,而其他的线程则用来处理查询语句,二者同步进行——虽然这个单一的消费线程可能并不那么容易与多个生产线程同步。不过若是能够仔细配置好负载平衡的话,仍然会极大地减少内存占用。
第二种模式叫做“stop and go”,用于处理结果集需要被一次返回时(例如调用ToList、ToArray或对结果排序)的情况。在这种模式下,将依次完成各个处理过程,并将结果统一返回给消费线程。这个模式在性能上将优于第一种模式,因为它省去了用来保持线程同步所花费的开销。
最后一种方法叫做“inverted enumeration”。该方法并不需要实现收集到所有的输出,然后在单一的线程中处理,而是将最终调用的函数通过ForAll扩展传递到每个线程中。这是目前为止最快的一种处理模式,不过这需要传递到ForAll中的函数是线程安全的,且最好不包含任何lock之类的互斥语句。
若是PLINQ中任意的一个线程抛出异常,那么所有的其他线程将会被终止。若是抛出了多个异常,那么这些异常将被组合成一个MultipleFailuresException类型的异常,但每个异常的调用堆栈仍会被保留。
(二).WCF的引入
笔者:相对于传统的三层架构,WCF相当于在最终[客户]表现层与业务逻辑层中插入了一个服务层
使用Web服务的每一种主要语言或平台都把与自身相关的特性集合在一个名字下,Java开源开发人员使用Axis,PHP阵营则使用PEAR,而基于微软工具的开发则使用WCF (Windows Communication Foundation).
WCF曾被称为Indigo,实际上不只是一个Web服务项目,它的目的是要把所有的分布式系统技术提供一种保护伞,其核心是一套面向服务的API。
现在,.NET框架是利用微软工具开发应用程序的最先进的方法。它已经为解决一系列C/S交互场景提供了办法。
比如,ASP.NET Web Services(ASMX)提供了通过Web服务开发应用程序接口的最简单的形式,而.NET Remoting则是使.NET和.NET应用程序交互的核心。
但在另一方面,很多系统不是构建得超出了.NET框架上下文的范围,就是得通过其它办法来进行特殊处理。
对于需要Web服务标准支持(WS-*说明书)的那些应用程序,微软则使用了Web Services Enhancements (WSE)。而对于那些遗留系统,经常用到的分布式交互技术则是用于异步通讯的Microsoft Messaging、COM+以及Microsoft's Host Integration Server。
你应该注意到所有这些场景都有一个相同的主题:分布式应用的通信。但是,很显然,每一种技术都用到不同的方法或技术来解决这个问题。而WCF背后的初衷就是针对应用程序中用到的所有通信接口为开发人员提供一步到位的方法。
WCF是对.NET技术的一个补充,而非现在.NET框架的替代品。但当你仔细思考把微软的分布式技术都统一到同一个屋檐下会达到怎样的效果后,你就会领悟到为什么说WCF/Indigo是简化创建面向服务设计的重要组成部分,以及它为什么是未来微软的操作系统Vista的一个基础。
在使用WCF时,你不仅只需要懂得一种方法就足以把很多应用作为服务暴露出来,而且你还可以用同样的方法来对付当前技术本身的底层细节。
用WCF服务使能化应用程序的真正概念并非与那些用来运行Web服务的概念不同。
(三).WWF/WF工作流的支持
笔者:举个例子,先下订单-->再确认订单-->发货-->收款-->交易完成 这就是一个顺序工作流. WorkFlow在处理这类业务逻辑时,就能派上用场
Microsoft Windows Workflow Foundation (WWF) 是一个可扩展框架,用于在 Windows 平台上开发工作流解决方案。作为即将问世的 Microsoft WinFX 的组成部分,Windows Workflow Foundation 同时提供了 API 和一些工具,用于开发和执行基于工作流的应用程序。Windows Workflow Foundation 提供单个统一的模型,以便创建跨越多个类别应用程序的端到端解决方案,包括人力工作流和系统工作流。
Windows Workflow Foundation 是一个广泛且通用的工作流框架,并且从下到上、在每个级别都针对可扩展性进行了设计。基于 Windows Workflow Foundation 的解决方案,由得到 Microsoft .NET 代码支持且在宿主应用程序中运行的互连组件组成。就像在定制的环境中以可视方式创建 Web 页一样,您需要在可视设计器中制订特定工作流的步骤,并且添加代码隐藏工作流组件以实现规则并定义业务过程。
Windows Workflow Foundation 提供一个工作流引擎、一个 .NET 托管 API、运行库服务以及与 Microsoft Visual Studio 2005 集成的可视化设计器和调试器。可使用 Windows Workflow Foundation 来生成并执行同时跨越客户端和服务器的工作流,以及可在所有类型的 .NET 应用程序内部执行的工作流。
工作流指的是:是以活动示意图形式定义的人力或系统过程模型。活动 是工作流中的一个步骤,并且是工作流的执行、重用和创作单位。活动示意图表达规则、操作、状态以及它们的关系。Windows Workflow Foundation 工作流通过安排活动而设计,然后它编译为 .NET 程序集,且在工作流运行库和公共语言运行库 (CLR) 中执行。
(四).WPF(Windows Presentation Foundation)
笔者:vista中的很cool的界面,以及07年很火的sliverlight就是WPF的实现之一
WPF的全稱是Windows Presentation Foundation,是微軟新發佈的Vista操作系統的三大核心開發庫之一,其主要負責的是圖形顯示,所以叫Presentation(呈現)。
作為新的圖形引擎,WPF是基於DirectX的,當然新增了很多新的功能。其2D和3D引擎的強大看看Vista的界面就明白了,再加上其對Aero圖形引擎的支援,更加讓你感到神奇。順便提一下,Aero是專門為3D桌面開發的引擎,可以讓桌面實現神奇的3D翻轉,這絕對是操作系統有史以來的一次神奇嘗試,雖然對硬件設定的要求也是驚人的,此前已有相關報道稱,Vista對顯卡十分挑剔就是出於執行Aero的考慮。
WPF前景分析
WPF其實不僅僅是圖形引擎而已,它將給Windows應用程式的開發帶來一次革命,因為新的架構提供了一種全新的開發模式。當然對於普通使用者而言,最直觀的就是界面越來越漂亮,看起來越來越舒服了;但對於開發人員而言,界面顯示和程式碼將更好的得到分離,這與從前的桌面應用程式開發有很多不同(界面設定和程式碼是融合在一起的),這是比較具有革命性的改變之一。還有就是桌面應用程式和瀏覽器應用程式的融合,根據ms的承諾,正在開發中的WPF/E,即WPF Everywhere版本,將為基於WPF的應用程式提供全面的瀏覽器支援,這意味著未來開發出的應用程式將可以基於瀏覽器在不同的操作系統上執行,當然由於目前還在開發中,我們並不確定會不會有一定的限制,根據WPF/E開發組的定義,WPF/E仍然是WPF的子集,而不是後繼版本。總體而言,WPF的前景應該是一片光明。
目前開發界的對WPF響應程度
目前已有很多人開始考慮或者已經轉向WPF,一場新的學習熱潮已經開始。但根據我最近的學習和瞭解,國內關於WPF的資料很少,除了msdn提供的資料以外,基本都是來自國外的資料,有些則是國外開發人員blog上的資料,當然都是英文的。因此如果現在能夠引進一些WPF的書絕對是很好的時機。而且國外目前的幾本WPF書也是剛剛上市,如果我們可以盡快引進的話,絕對可以輔助國內開發人員在最短時間內趕上國際步伐。
目前微軟針對WPF提供的服務和支援
隨著Vista RTM的發佈,微軟新一輪的技術推廣已經開始。其實在此之前,WPF已經有很大的推廣,因為CTP版本已經發佈了有一段日子了。當然很多開發人員主要以技術研究為主,也有少數公司已經開始從事基於WPF的產品研發工作。
1. 目前WPF的正式版本已經發佈(隨.net framework 3.0正式版發佈),你可以從msdn上免費下載
2. 相應的技術支援已經開始,但目前僅限於大客戶,主要做售前技術支援,對於普通開發人員的技術支援可能要等到明年2月份才會開始(個人知道的情況,請以微軟官方技術支援網站發佈的訊息為準)
3. WPF的VS2005外掛目前還只有社區預覽版(CTP版),也是從msdn上免費下載的,但正式版恐怕還要等一段時間,但使用CTP版本確實已經可以在VS2005中進行所見即所得的WPF開發。
4. WPF/E CTP版本已經發佈,你可以在msdn上免費下載。同時發佈的還有WPF/E Sample Pack for CTP。