RSS 2.0 Feed
.NET
摘要:刚才在china-pub看到《敏捷软件开发:原则、模式与实践(C#版)》已经出版了。这本书是以前那本《敏捷软件开发:原则、模式与实践》的C#版,这是不是说明C#程序员的数量已经多到Robert Martin无法忽视的程度了呢?:) 既然说到了图书,就再推荐一本我现在正在温习的,《高级.NET程序设计》(《Advanced .NET Programming》,中文版翻译质量比较差劲)。此书的内容完全对得起书名中的“Advanced”,要比一般的《Professional XXX》好得多,如果你已经看完了《CLR via C#》,那么强力推荐这本。可惜的是此书的作者并未随着.NET升级而对书的内容进行更新,但基本上书中的内容并未过时。...[阅读全文]

posted @ | Feedback (7) | Filed Under [ .NET ]

摘要:相信大家在前几天就已经知道,在PDC05大会上,微软正式发布了Windows Workflow Foundation Beta1,您可以在www.windowsworkflow.net下载到它。首先要说明的是,WWF面对的是开发人员,它提供的是一个工作流基础框架,它并非一个直接面对用户的工作流产品。实际上,K2.Net已经开始基于WWF开发其下一代工作流产品。相关消息:新代K2.net将建基于Windows Workflow之上Captaris Plans to Use Windows Workflow Foundation for Its Business Information Delivery Solutions...[阅读全文]

posted @ | Feedback (29) | Filed Under [ .NET ]

摘要:最近Richard Grimes的一篇文章,把.Net社区搅弄了一番,CSDN也将这个新闻放在了首页上。博客园也有人发了一篇帖子,表示了自己对.Net的疑问。Visual C#的产品经理Dan Fernandez则在他的Blog上发表了一篇文章,逐条的反驳了Richard Grimes的观点。那么我也凑凑热闹,来讲一讲自己的观点,为什么Microsoft不做某些看起来“理所当然”的事情。一、Microsoft对.Net没有信心吗?恰恰相反,Microsoft相对IBM、SUN最大的不同就是,如果Microsoft认准的方向,会将整个Microsoft全部“押”上去,投入所有的力量,尽最大的努力做到最好。从DOS到Windows,从Win32到.Net,无不是如此。不管是IBM,还是SUN,在推广某项技术的同时,总会“留上一手”,以免“万一不利”的时候,还有备选方案,或者能够避免让整个公司受损。看起来似乎很“安全”,但是,如果连公司自己都没有“决一死战”的信心和勇气,还能指望消费者能相信自己吗?当Lotus、WordStar领先于办公套件市场时,当几乎所有上网的人都使用Netscape时,当OS/2号称将取代DOS和Windows时,当Java似乎要将所有程序员吸引过去时,如果没有“决一死战”的信心,没有将整个公司“押”上去的勇气,你认为,Microsoft能走到今天吗?二、为什么Microsoft自己不将所有现有产品都彻底用.Net改写掉?一家软件公司最愚蠢的事情之一,就是公司的管理层听信了开发人员的下面这句话:“天哪,旧版本的代码简直就是垃圾,我们唯一的选择就是重头设计一个全新的系统,用最棒的技术来构建!”无数软件公司都是死在了这句话之下。Netscape的管理层就曾经听信过开发人员的话,用全新的代码去构建Netscape的下一个版本,而不是基于旧版本进行逐步的升级。最后,似乎永远无法Release的全新版本,把Netscape彻底拖死了...三、但是,“纯粹”的.Net,多激动人心呀!嗯,有个专门的术语,叫做“The Myth of .NET Purity”(纯血统.Net神话),请先阅读这篇文章。我们生活在一个真实的世界,在这个世界中,已经有大量的使用Win32 API、COM等“过时”的技术构建起来的系统,而且这些系统可能还需要维护和升级。如果我们生活在一个完美的世界,那么,我们倒的确可以尝试用最新的技术去构建和升级一切系统!顺便一提的是,Longhorn本身不是托管的(Longhorn is NOT managed),而且从一开始就没打算将其设计成一个纯.Net的OS。Longhorn仍然是以现有的Windows代码为基础,经过许多的改进而成的。重要的是,Longhorn的开发接口WinFX是托管的。...[阅读全文]

posted @ | Feedback (70) | Filed Under [ .NET ]

摘要:在.Net Framework 2.0中,新增了一个名称空间:System.Transactions。从其名字就可以看出来,里面包含了Transaction相关的类。System.Transactions提供了一个“轻量级”的、易于使用的Transaction框架。 在以前,要实现Transaction需要利用EnterpriseServices,让组件从ServiceComponent继承下来。而通过System.Transactions,只要简单的几行代码,不需要继承,不需要Attribute标记,呵呵。 下面介绍System.Transactions中最简单的(也可能是以后最常见的)用法: using (TransactionScope ts = new TransactionScope()){    // 在这里编写需要具备Transaction的代码    ts.Consistent = true;} TransactionScope类用来构建一个Transaction Scope,在这个Scope里面的代码将具备Transaction的能力。TransactionScope实现了IDisposable,在调用TransactionScope.Dispose()的时候,如果Consistent属性没有被设置成true,那么就将会触发Rollback动作。using (TransactionScope ts = new TransactionScope()){    using (SqlConnection conn = new SqlConnection("..."))    {        conn.Open();    }    ts.Consistent = true;} 上面的代码就演示了在一个Transaction Scope里面,打开一个数据库连接。这个数据库连接由于处在一个Transaction Scope里面,所以会自动获得Transaction的能力。如果这里数据库连接的是SqlServer2005,那么这个Transaction将不会激活一个MSDTC管理的Distributed Transaction,而是会由.Net创建一个Local Transaction,性能非常的高。但是如果是SqlServer2000或者7,那么则会自动激活一个Distributed Transaction,在性能上遭受一定的损失。using (TransactionScope ts = new TransactionScope()){    using (SqlConnection conn = new SqlConnection("..."))    {        conn.Open();        using (SqlConnection conn2 = new SqlConnection("..."))        {            conn2.Open();        }    }    ts.Consistent = true;} 这个例子更加充分的说明了Transaction Scope的强大,两个数据库连接!虽然上面的conn和conn2是两个不同的连接对象,可能分别连接到不同的数据库,但是由于它们处在一个Transaction Scope中,它们就具备了“联动”的Transaction能力。在这里,将自动激活一个MSDTC管理的Distributed Transaction。(可以通过打开管理中心里面的组件服务,来察看当前的Distributed Transaction列表。)下面再介绍如何手动将一项资源(Resource)参与(enlist)到一个分布式事务中:ICommittableTransaction tr = Transaction.Create();using (SqlConnection conn = new SqlConnection("...")){    conn.EnlistTransaction(tr as ITransaction);}tr.Commit();上面的代码手工创建了一个ICommittableTransaction对象(通过Transaction类的static方法)。SqlConnection对象通过EnlistTransaction()方法参与到这个Transaction中去。注意:EnlistTransaction()方法只接受ITransaction类型,因为ITransaction没有Commit()方法,你肯定不会希望ICommittableTransaction之外的其他对象来执行Commit()方法吧,呵呵。参考资源链接:System.Transactions命名空间MSDNTV: Introducing System.Transactions in .NET Framework 2.0...[阅读全文]

posted @ | Feedback (35) | Filed Under [ .NET ]

摘要:如何在某个程序中宿主一个http webserver,能够接收客户端(或者用“服务端”这个词)传入的http请求包,并将结果返回?这是一个非常常见的需求,比如,在一个面向服务的架构中,一个Service端可能就需要能够以http channel接收其他Service端发送来的Message。 在过去,我们(几乎)只能依靠IIS,但现在我们有了http.sys。http.sys是一个位于Win2003和WinXP SP2中的操作系统核心组件,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯。 .Net Framework 2.0中充分利用了http.sys。比如通过HttpListener这个类,我们可以在自己的应用程序中轻松建立一个http server,接收标准的http请求信息。 在一个SOA的系统中,我们就可以更加方便的建立http channel,来传送信息了。Indigo就使用了http.sys,来脱离IIS实现self-host。在Don Box以前的blog上,就曾经演示了Indigo如何self-host的一些示范代码。 最新在自己的电脑上研究Indigo,希望能多些这个方面的文章和大家分享。 http.sys的正式Platform SDK文档:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/http_api_start_page.asp一篇不错的介绍性Blog文章:http://dotnetjunkies.com/WebLog/softwaremaker/archive/2004/08/08/21447.aspx在Don Box以前的Blog的这个页面上有不少相关的文章:http://www.gotdotnet.com/team/dbox/default.aspx?month=2004-03...[阅读全文]

posted @ | Feedback (6) | Filed Under [ .NET ]

摘要:Rockford Lhotka在ServerSide.Net上发表了一篇文章《The Fallacy of the Data Layer》(博客园的朋友已经将此文翻译成了中文)。作者在这篇文章中表达了一种观点,即数据源与其说是整个Application中的一个Layer(Tier),不如把数据源当作Applica