RSS 2.0 Feed
Dot Net
摘要:Windows Live Developer Centerhttp://msdn.microsoft.com/live/default.aspx 现在什么都带Live了,试了很多带Live的域名,都被注册了,还是没赶上潮流呀 Mashup 是什么呢 根据wikipedia的解释(http://en.wikipedia.org/wiki/Mashup)代表两类目前流行的东西:一是一种音乐风格 ; 二是所谓Mashup web application hybrid , 指把多个不同的支持web api的应用堆叠成为新型web服务 Mashup Camp 在美国是由一群geek发起的技术+idea聚会, 详细可以参考:http://www.mashupcamp.com/  canvas for IE http://groups.yahoo.com/group/canvas-developers/message/180看起来好像很美, Drawing Graphics with Canvashttp://developer.mozilla.org/en/docs/Drawing_Graphics_with_Canvas demohttp://redsquirrel.com/dave/play/ajaxtrains.html 八卦:最浪费的域名,看看就知道了,http://down.com/,另外,dell一万美金的电脑已经卖完了...[阅读全文]

posted @ | Feedback (3) | Filed Under [ Dot Net ]

摘要:release notes http://nunit.com/testweb/index.php?p=releaseNotes&r=2.2.4 依然不习惯vs 2005自动生成的测试代码,以为很贴心,很细致,代码实际上太多太乱了。 还是简单的几行代码就晚上测试看着比较顺心。...[阅读全文]

posted @ | Feedback (3) | Filed Under [ Dot Net ]

摘要:如果要找一个和我们的UI层设计最类似的open soure软件的话,那应该是 http://www.myxaml.com/ 作者曾经在codeproject上发表过一系列关于declare programming的文章,对我们的启发很大,不过xaml和作者的专栏很久更新了。 另外从作者这里学到的是 Property Events和Property Pool  ...[阅读全文]

posted @ | Feedback (3) | Filed Under [ Dot Net ]

摘要:修改不需要编译,用户现场只用记事本或者查询分析器就完成用户的需求对客户来说有吸引力。 可以做编辑器,让BA来控制流程和逻辑 借助用sql或者xsl,可以方便的修改和转换。...[阅读全文]

posted @ | Feedback (11) | Filed Under [ Dot Net ]

摘要:Download details IEDevToolbar 试用了一会儿,确实为开发带来一些便利。 官方介绍: Overview The IE Developer Toolbar provides several features for deeply exploring and understanding Web pages.-- Explore and modify the document object model (DOM) of a web page.-- Locate and select specific elements on a web page through a variety of techniques.-- Selectively disable Internet Explorer settings.-- View HTML object class names, ID's, and details such as link paths, tab index values, and access keys.-- Outline tables, table cells, images, or selected tags.-- Validate HTML, CSS, WAI, and RSS web feed links.-- Display image dimensions, file sizes, path information, and alternate (ALT) text.-- Immediately resize the browser window to 800x600......[阅读全文]

posted @ | Feedback (1) | Filed Under [ Dot Net ]

摘要:单例模式   使用对象时最基本的事情就是要首先创建对象的实例,一般情况下,这是一件极其简单的事情,就是用new运算符来创建某个对象的实例,简单的人们都不想提及。然而有时候你会发现创建对象的实例也不是那么简单。   比如有一些类,在整个程序运行期间只允许一个实例,或者我们说如果有多个实例存在程序逻辑会变得难以控制,很可能遭遇错误,比如对程序所需要的资源如连接池之类的做集中管理。   或者从逻辑上讲,在整个程序运行期间可以只有一个实例,当然也可以创建多个实例,这对程序逻辑没有影响,但是实施强制单一对象实例的代价要远低于带来的收益。   全部强制对象单一机制有些多余,我们要比较实施强制措施的代价,而不同的实施方案代价和收益是不同的。   最原始方案的就是全局变量,程序开始运行时初始化这个全局变量,代码中每一个使用该类的地方都引用这个全局变量。   全局变量一个缺点是有些对象实例实际上很可能根本不会用到,而初始化又恰恰要花点时间。没有办法做到延迟加载,当然有聪明的人会说一样可以实现延迟加载,设置一个函数,每次通过这个函数来获得这个全局变量的引用,在函数里面会判断该全局变量的状态,如果没有初始化才作初始化的动作。实际上根本的缺点在于当这样的情况变得越来越多的时候,逻辑变得很复杂,代码变得难以控制,职责变得很不明确。   那么我们开始重构,将类的单一实例以及类初始化的职责封装起来,然后提供一个全局的访问点让其他的代码能够访问到这个单一的类的实例。简单的实现方式可能如下: public sealed class Singleton {         static Singleton instance = null;         private Singleton () {}         public static Singleton Instance()         {                 if (instance==null) {instance = new Singleton (); }                 return instance;         } }   这里把Singleton类的构造函数设置为private是为了其他类不能直接用new方法来创建多个Singleton的实例并使用它,而是提供了一个全局的访问接口Instance()方法,其他的代码只能通过访问Instance方法来获得一个Singleton类的实例。在Instance()中会判断instance是否已经创建,如果没有创建的话才去创建一个实例出来。   练习题:为什么instance要声明为static类型的变量。   简单测试之后发现可以Singleton类这样的设计实现了我们的意图,那么我们再检查Singleton的代码 如果多个线程同时调用Instance()方法,而这时instance还没有被创建,这时会怎么样呢,怎样保持线程同步?   我们可以对Singleton做一点改造,用lock来强制线程同步 public sealed class SingletonLock {     static SingletonLock instance=null;     static readonly object padlock = new object();             private SingletonLock() {}     public static SingletonLock Instance()     {         lock (padlock)         {             if (instance==null) {instance = new SingletonLock();}             return instance;         }     } }   每次强制线程同步是很耗费资源的,而实际上只有第一次访问Instance()才需要强制线程同步以确保只创建一个实例,那么可以在锁定线程之前先判断instance是否为null,如果为null才调用lock锁定线程。 public static SingletonLock Instance() {     if(instance==null)     {         lock (padlock)         {             if (instance==null)        ......[阅读全文]

posted @ | Feedback (8) | Filed Under [ 拥抱变化 Dot Net ]

摘要:Template Method使用了对象继承,而继承是一种很强的对象和对象之间的耦合关系,底层模块还是依赖于高层模块,比如子类要知道哪些abstract method要重写,哪些hook method可以做扩展,哪些基类资源可以利用。   strategy模式使用对象之间的组合关系来代替继承,进一步减弱高层模块和底层模块之间的依赖,让底层独立于高层,使其完全符合更符合DIP的原则, 这样底层代码不需要了解高层代码是怎么工作的,高层也不需要知道底层的实现细节, 相对于Template Method模式来说strategy模式革命的更彻底一些。   还拿Report来作一个简单的例子。 Report的输出可以是Html格式的,可以是Word格式的,也可以是PDF格式的,我们可以定义一个Interface:IReportPublisher,在IReportPublisher中定义高层模块和低层模块之间的调用协议。(或者说Contract)   Interface IReportPublisher {public void Publish()}   HTMLReportPublisher : IReportPublisher WordReportPublisher : IReportPublisher PDFReportPublisher : IReportPublisher   Report {       Public void GenerateReport() {       …       reportPublisher = MyContext.GetService(…)       reportPublisher.Publish(reportData)       … } }   当然实现strategy模式也有代价,将Template Method改造成strategy模式后,架构中层次变复杂了,一些Template Method模式原有的特性就没有办法利用了,比如子类可以调用基类一些资源。   应用任何一种模式都会有代价,学习模式时,明白为什么这么做比明白怎么实现更重要,了解模式带来的收益的同时也要了解你要付出的代价。模式也是一直随着技术的发展在发展的,有些模式在慢慢消亡,有些新的模式出现,有些模式被新的编程语言天然支持,有些模式的形式发生了变化,Gof的《设计模式》里的一些观点现在来说已经是有些过时了。   strategy模式和Template Method模式的对比还体现了面向对象的另一个思想,解决对象之间的协作问题应用对象组合优先于对象继承。在面向对象的初期,人们非常看重对象继承,继承一个类,就可以重用该类的代码,把很多类的代码抽取到一个基类中就可以去掉代码重复,创建一个子类,改变一点点就能创造出一个能实现新功能的类出来,通过继承我们可以建立完整的软件结构分类,每一层都可以重用该层以上的代码,这看起来很美好,到后来人们才慢慢发现继承非常容易被过度使用,而过度使用带来的收益比代价要高的多,所以我们减少对继承的使用,用组合和委托来代替继承。   strategy模式和Template Method模式都面对一个问题,在运行时怎么创建某个子类或者某个实现了某个interface的类的实例,那就涉及关于创建对象实例的模式:Singleton模式和Factory模式。...[阅读全文]

posted @ | Feedback (0) | Filed Under [ 拥抱变化 Dot Net ]

摘要:CCNet 1.0 RC1已经发布有些时间了,从进度看1.0正式版应该很快就会发布了。 CCNet支持直接使用Visual Studio IDE编译,单从编译的角度讲使用devenv task比写一个nant的build文件简单,但是不是每一台用来做持续集成的机器都会装Visual Studio,而且nant可以做更多的事情。<devenv solutionfile="myproject.sln" configuration="debug" /> 在nant中如果使用solution来做编译,可能会遇到.net 1_x sdk不可用的错误,这是因为没有安装.Net SDK你可以检查注册表中的sdkInstallRootv1.1项来检查机器上有没有装SDKHKML\Software\Microsoft\.NETFramework\sdkInstallRootv1.1如果安装SDK后还会有该错误发生,可以试着把.Net SDK的Bin目录添加到系统Path中,并且在NAnt.exe.config中指定所需的.Net 版本 CCNet从0.9.1开始, WebDashboard新增了一个NAnt Timing Report,NAnt Timing Report可以显示NAnt每一个target的执行时间信息,不过需要NAnt 0.85 RC3支持。 在nant中用exec调用nunit等工具需要注意,如果命令行参数中含有文件路径,而且路径名含有空格,需要将文件路径用双引号括起来如果有些程序实在处理起来太麻烦,比如NCover,可以把涉及到的文件copy到一个路径不含空格的临时目录中,处理完后再删掉 nant中调用fxcop时通过/p制定.FxCop文件灵活性更大一些,因为你可以在.FxCop中作一些很复杂的设置,单靠命令行做这些设置太繁琐,如果项目会引用到其他的项目,需要用 /d参数来指定路径<target name="fxcop" > <exec program="${fxcop.executable}"  commandline="/p:${workingdir}\project.FxCop /o:${artifactdir}\results-fxcop.xml " failonerror="false"/></target> 在nant中支持用task nunit2直接调用nunit,但是用exec执行可以忽略nunit版本的影响,更方便些 在持续集成的过程中会产生很多文件,比如nunit的结果,fxcop的结果,一个好的实践是设置ccnet的artifactDirectory属性,把这些文件全部放到artifact目录中,在nant的build文件中也可以访问到artifactDirectory,ccnet会把下列参数通过命令行的形式传递给nantLabelCCNetBuildConditionCCNetIntegrationStatusCCNetLabelCCNetLastIntegrationStatusCCNetProjectCCNetBuildDateCCNetBuildTimeCCNetArtifactDirectoryCCNetWorkingDirectory 在CCNet的Dashboard report中默认是支持simian的,但是simian是要钱的,要钱俺们是不用的,可以找一个免费的替代的。 如果你使用了其他ccnet Dashboard没有默认支持的程序,可以通过修改dashboard.config来让这些程序的结果显示在Dashboard中比如要显示Vil的分析结果<xslReportBuildPlugin description="Vil Report" actionName="VilBuildReport" xslFileName="xsl\vil.xsl"/> vil也不是完全免费的,如果分析的assemblies超过100个type需要申请key,vil的结果还没看明白...[阅读全文]

posted @ | Feedback (5) | Filed Under [ Dot Net ]

摘要:抽空将CCNet从0.7升级到0.9 0.9提供了安装文件,部署更简单了,Dashboard也变得整洁多了 0.9去掉了CommandLineBuilder,以Executable Task取而代之FxCop仍然没有成为内置的Task虽然有了NUnit Task,但是不如放在nant中执行test方便性能有提高,不过解析大的xml文件时cpu占用率仍然很高 CCNet+nant,再加Visual Build的协助,非常好的持续集成平台...[阅读全文]

posted @ | Feedback (3) | Filed Under [ Dot Net ]

摘要:AJAX Wrapper for .NET 作者提供了几个例子,dll可以免费下载,还有一段video讲解怎么使用。 新的特性可能会包括- build a Javascript method by simply adding an attribute to your methods- return every data type like int, long, double, bool, string,...- return your own classes you are using in your favorite programming language- return System.DateTime, System.Data.DataSet, System.Data.DataTable- return arrays of objects- use the returned objects as a local Javascript object 在Lostinet.Rane在外有了一个新的选择。 当然Lostinet.Rane也很好用。一直没见到Lostinet.Rane的license,到底Lostinet.Rane是免费的还是要钱的? :)...[阅读全文]

posted @ | Feedback (7) | Filed Under [ Dot Net ]

Full Dot Net Archive