摘要:

昨天在进行Code Review的时候,发现一个关于通过ConfigurationManager的GetSection方法进行配置节读取的问题。虽然这是一个很小的问题,还是它已经存在在项目里面很久了,直到今天才被发现,所以觉得具有一定分享的价值。
阅读全文
posted @ 2011-01-15 15:27
Artech
阅读(9225)
推荐(20)
摘要:

在《上篇》中我们揭示了“缺省参数”的本质,现在我们接着来谈谈C#4.0中另一个重要的新特性:协变(Covariance)与逆变(Contravariance)。对于协变与逆变,大家肯定不会感到陌生,但是我相信有很多人不能很清晰地说出他们之间的区别。我希望通过这篇文章能够让读者更加深刻的认识协变与逆变。但是也不排除另一种可能,那就是读者这篇文章你对这两个概念更加模糊。文章一些内容仅代表个人观点,如有不妥,还望指正。
阅读全文
posted @ 2011-01-13 21:08
Artech
阅读(23475)
推荐(88)
摘要:

C#4.0关于缺省参数的新特性,相信大家都不会陌生。所谓缺省参数,顾名思义,就是在声明方法的某个参数的时候为之指定一个默认值,在调用该方法的时候如果采用该默认值,你就无须指定该参数。和很多语言层面特性(语法糖)的实现一样,缺省参数也是编译器为我们玩的一个小花招。缺省参数最终体现为两个特殊的自定义特性OptionalAttribute和DefaultParameterValueAttribute 。
阅读全文
posted @ 2011-01-12 13:41
Artech
阅读(29893)
推荐(53)
摘要:

在一个Web应用中,当你添加一个Web页面的时候,VS实际上会为你创建三个文件:Xxx.aspx, Xxx.aspx.cs和Xxx.aspx.designer.cs,后面两个文件(依赖文件)依赖于第一个文件(主文件)。依赖文件嵌套在主文件下,在结构上看起来非常的清晰。那么你是否可以把存在于同一个目录下的两个相关的文件也建立这种依赖关系呢?
阅读全文
posted @ 2011-01-06 22:11
Artech
阅读(13019)
推荐(23)
摘要:

软件设计有一句话叫做“约定优于配置”,很多人将其作为拒绝配置的理由。但是,在很多场景中,配置是提供应用灵活度的首要甚至是唯一途径。对于框架的设计者来说,对于配置的驾驭是一项基本的技能。本篇文章通过一个简单而使用的例子,通过自定义配置的形式实现“插件式”设计。
阅读全文
posted @ 2011-01-05 20:23
Artech
阅读(7762)
推荐(38)
摘要:

之前写了两篇文章《.NET资源并不限于.ResX文件》(上篇、下篇),介绍了如何通过自定义ResourceManager的方式来扩展资源的存储形式。在本篇文章中我们将实现自定义ResourceManager和ASP.NET之间的集成,让ASP.NET现有的资源编程方式支持我们希望的资源存储方式。
阅读全文
posted @ 2010-12-30 22:43
Artech
阅读(6663)
推荐(13)
摘要:

在《上篇》中我们谈到ResourceManager在默认的情况下只能提供对内嵌于程序集的.resources资源文件的存取。为了实现对独立二进制.resources资源文件的支持,我们自定义了BinaryResoruceNManager。在本篇中我们还将创建两个自定义的ResourceManager,以实现对独立.resx资源文件和自定义结构的XML资源文件的支持。
阅读全文
posted @ 2010-12-17 23:03
Artech
阅读(9972)
推荐(14)
摘要:

为了构建一个轻量级的资源管理框架以满足简单的本地化(Localization)的需求,我试图直接对现有的Resource编程模型进行扩展。虽然最终没能满足我们的需求,但是这两天也算对.NET如何进行资源的存取进行了深入的学习,所以将我对此的认识通过博文的方式与诸位分享。在本篇文章中,我会通过自定义ResourceManager让资源的存储形式不仅仅局限于.ResX文件,你可以根据需要实现任意的存储方式,比如结构化的XML、数据库表,甚至是通过远程访问获取资源。
阅读全文
posted @ 2010-12-16 21:47
Artech
阅读(10970)
推荐(52)
摘要:

在之前一篇介绍CDC的文章中,我说审核跟踪是大部分企业级应用不可以或缺的功能。本篇给你一个完整的解决方案,不仅可以记录每一笔业务操作的信息(比如操作时间、操作者等),并且可以追踪每一笔业务引起的说有数据的改变(如果需要)。
阅读全文
posted @ 2010-11-29 17:04
Artech
阅读(15085)
推荐(56)
摘要:

“梦想这东西和经典一样,永远不会因为时间而褪色,反而更显珍贵。”这是10月28日上线的网络短片《老男孩》在片尾打出的一行字幕,连日来,这部以草根、怀旧、青春、人生、爱情、友情等为基调的“电影”让众多网友直言“飙泪”、“泪流满面”,截至昨天下午,该片仅在某视频网的官方播放次数就已近1600万次。如果这是一部正式上线的电影,有一半的人买票(每张计半价25元),票房也有两个亿了……《老男孩》为什么红,它凭啥点中了观众的泪穴?
阅读全文
posted @ 2010-11-27 20:49
Artech
阅读(6010)
推荐(8)
摘要:

在这之前我写过一些文章来介绍关于字符串内存分配和驻留的文章,涉及到的观点主要有:字符串的驻留机制避免了重复对象的创建;驻留的字符串对象不能被GC回收;被驻留的字符串是被同一进程中所有应用程序域共享的。这里我通过内存分析工具来证明这些结论。
阅读全文
posted @ 2010-11-25 22:12
Artech
阅读(10531)
推荐(56)
摘要:

BackgroundWorker允许您在单独的专用线程上运行操作。操作是异步执行的,用户可能在操作执行过程中关闭窗体,而窗体的关闭会伴随着Dispose方法的执行。如果我们注册了RunWorkerCompleted事件,并且在该事件处理程序中需要操作这个被Dispose的窗体,就会出现一些无法预知的异常。
阅读全文
posted @ 2010-11-25 13:34
Artech
阅读(7879)
推荐(13)
摘要:

对于大部分企业应用来用,有一个基本的功能必不可少,那就是Audit Trail。我们采用它记录每一笔业务操作的基本信息,比如操作时间、操作者等。对于高安全级别的应用,我们甚至需要记录每笔业务操作引起的数据的改变。很多人都会想到采用触发器来实现,在这里介绍一种更好的方案:SQLCDC。
阅读全文
posted @ 2010-11-20 00:50
Artech
阅读(17212)
推荐(60)
摘要:

前一阵子写了不少关于代码生成相关的文章,介绍了一些如何通过VS自动生成代码的解决方案,比如CodeDOM、T4以及ASP.NET的BuildProvider等。现在将它们作一个汇总,给广大读者作一个参考。
阅读全文
posted @ 2010-11-17 21:55
Artech
阅读(24004)
推荐(85)
摘要:

在这之前,我写了一系列关于代码生成和T4相关的文章,而我现在也试图将T4引入我们自己的开发框架。在实践中遇到了一些问题,也解决了不少问题。如果你也在进行T4相关的开发,相信你也一定会遇到这些问题。为此,特意将这些问题和解决方案与朋友们分享,希望在遇到这些问题的时候少走弯路。本篇文章介绍的是两个重要的话题:程序集锁定和调试。
阅读全文
posted @ 2010-11-16 22:58
Artech
阅读(6696)
推荐(15)
摘要:

Change Data Capture records INSERTs, UPDATEs, and DELETEs applied to SQL Server tables, and makes a record available of what changed, where, and when, in simple relational 'change tables' rather than in an esoteric chopped salad of XML. These change tables contain columns that reflect the column structure of the source table you have chosen to track, along with the metadata needed to understand the c
阅读全文
posted @ 2010-11-16 17:30
Artech
阅读(3584)
推荐(10)
摘要:

在众多.NET应用下的代码生成方案中,比如CodeDOM,BuildProvider, 我觉得T4是最好的一种。如果你编写T4模板,你不得不面对一个问题——如何引用一个程序集?VS 2010采用了与VS2008不同的程序集引用的解析机制。本篇文章为你介绍在VS2010下5种不同的程序集引用的方式。
阅读全文
posted @ 2010-11-09 23:25
Artech
阅读(15502)
推荐(34)
摘要:

如今闹得不可开交的3Q大战已经成了一道独特的风景线。这两个中国最大的客户端软件提供商各有拥趸无数,双方铆足了劲相互吐口水、扔砖头,现在貌似到了动刀子了。周、马在媒体上也都将自己标榜为“美貌与智慧并重、英雄与狭义的化生”。但是在我个人的眼中,却只有两个流氓,但是在当今这个混杂的环境中,只有流氓才能生存。
阅读全文
posted @ 2010-11-07 11:23
Artech
阅读(11375)
推荐(170)
摘要:

之前写了一些关于代码生成的文章,提供了两种不同方式的代码生成解决方案,即CodeDOM+Custom Tool和T4。对于ASP.NET应用,你还有第三种选择——自定义BuildProvider。对于ASP.NET应用的开发者来说,你可能不知道什么是BuildProvider,但是你几乎无时无刻不在使用它所带来的代码生成机制。
阅读全文
posted @ 2010-11-06 22:29
Artech
阅读(7852)
推荐(30)
摘要:

Welcome to the Windows Azure Developer Guidance Map! This map is a consolidated index of Windows Azure content collections for developers. The primary content collections included in this map are: Code Samples, How Tos, Videos, and Training. Within the content collections, the resources are organized by Windows Azure features, common tasks, and common categories for Windows Azure development.
阅读全文
posted @ 2010-11-03 09:23
Artech
阅读(3940)
推荐(12)
摘要:

在一个基于ASP.NET应用中,我们通常使用Session保存基于某个客户端的状态信息。但是这种单纯使用Session的编程方式具有很多局限。为了实现对客户端状态的有效管理,并提高应用开发效率,在很多年前我们的开发框架体系中就具有相关的编程框架。最近我开始对其进行升级和重新设计,将大体上实现原理写出来与大家分享。
阅读全文
posted @ 2010-10-31 21:08
Artech
阅读(10109)
推荐(54)
摘要:

C#的yield关键字由来以久,如果我没有记错的话,应该是在C# 2.0中被引入的。相信大家此关键字的用法已经了然于胸,很多人也了解yield背后的“延迟赋值”机制。但是即使你知道这个机制,你也很容易在不经意间掉入它制造的陷阱。
阅读全文
posted @ 2010-10-28 20:32
Artech
阅读(10144)
推荐(41)
摘要:

在《上篇》中我们通过T4模板为我们指定的数据表成功生成了我们需要的用于添加、修改和删除操作的存储过程。但是这是一种基于单个文件的解决方案,即我们必须为每一个生成的存储过程建立一个模板。如果我们提供一种基于多文件的代码生成方式,将会为编程人员带来极大的便利,本篇文章将为你解决这个问题。
阅读全文
posted @ 2010-10-25 19:34
Artech
阅读(19844)
推荐(44)
摘要:

在《基于T4的代码生成方式》中,我对T4模板的组成结构、语法,以及T4引擎的工作原理进行了大体的介绍,并且编写了一个T4模板实现了如何将一个XML转变成C#代码。为了让由此需求的读者对T4有更深的了解,我们通过T4来做一些更加实际的事情——为某个数据表自动生成进行插入、修改和删除的存储过程。
阅读全文
posted @ 2010-10-25 07:37
Artech
阅读(23130)
推荐(66)
摘要:

在之前写一篇文章《从数据到代码》(上篇、下篇)中,我通过基于CodeDOM+Custom Tool的代码生成方式实现了将一个XML表示的消息列表转换成了相应的C#代码,从而达到了强类型编程的目的。实际上,我们最常用的代码生成当时不是CodeDOM,而是T4,这是一个更为强大,并且适用范围更广的代码生成技术。今天,我将相同的例子通过T4的方式再实现一次
阅读全文
posted @ 2010-10-23 22:25
Artech
阅读(23488)
推荐(98)
摘要:

《上篇》中我们主要讨论的是程序集和应用程序域的话题,着重介绍了两个不同的程序集加载方式:独占方式和共享方式("中立域"方式);以及基于"进程范围内"的字符串驻留。这篇将关注点放在托管对象创建时"内存的分配"和对"大对象的回收"上。
阅读全文
posted @ 2010-10-20 22:24
Artech
阅读(9648)
推荐(65)
摘要:

半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此,今天按照PPT的内容写了一篇文章。本篇文章不会在讨论那些我们熟悉的话题,比如“值类型引用类型具有怎样的区别?”、“垃圾回收分为几个步骤?”,而是讨论一些不"不一样"的东西。
阅读全文
posted @ 2010-10-18 22:02
Artech
阅读(12663)
推荐(131)
摘要:

Rob beat me to it. Blogging about T4 (the Text Template Transformation Toolkit) had been on my list literally for a year. He and I were singing its praises last night. Hopefully I can add something small to the conversation.
What's the story? Well, T4 is a code generator built right into Visual Studio. To be clear, you HAVE THIS NOW on your system…go play. Now's the time to introduce code generation to y
阅读全文
posted @ 2010-10-17 17:12
Artech
阅读(5625)
推荐(2)
摘要:

关于“验证框架”,先后推出了《编程篇》、《设计篇》和《改进篇》,本不打算再写《XXX篇》的。但是今天收到两个园友的短消息,想了解一下如何定义自己的验证规则,同时为了让本系列看起来完整,额外写了《扩展篇》收尾。本篇我们写一个简单的验证器,用于验证字符串类型属性成员的长度。
阅读全文
posted @ 2010-10-15 20:42
Artech
阅读(3685)
推荐(24)
摘要:

自《编程篇》和《设计篇》发布以来,收到了一些反馈,给了很大的启发。为此,我对这个“验证框架”进行了相应的改进,让CompositeValidator具有了解析“验证表达式”的能力。
阅读全文
posted @ 2010-10-14 20:11
Artech
阅读(3073)
推荐(22)
摘要:

没有想到自己头脑发热写了一个简陋版本的所谓“验证框架”能够得到众多网友的推荐。个人觉得这个验证框架有两个主要的特点是:提供复杂逻辑判断和多验证规则的支持。《编程篇》中,我主要介绍了如何通过自定义特性的方式进行验证规则的定义,在本篇中我主要来介绍该验证框架的设计原理和实现。
阅读全文
posted @ 2010-10-13 21:17
Artech
阅读(4032)
推荐(26)
摘要:

昨天晚上突发奇想,弄了一个简易版的验证框架,用于进行数据实体的验证。目前仅仅实现基于属性的声明式的验证,即通过自定义特性的方式将相应的Validator应用到对应的属性上,并设置相应的验证规则。在这里我们模拟一个有趣的场景来介绍这个迷你验证框架的使用:找对象,不论是找男朋友还是女朋友,还是不男不女的朋友,都具有一定的标准,在这里我们把这些标准表示成“验证规则”...
阅读全文
posted @ 2010-10-12 16:50
Artech
阅读(5341)
推荐(57)
摘要:

我们知道Modifier为Internal的类型成员仅限于当前程序集能够访问,但是在某些情况下,我们希望将它们暴露给另一个程序集。比较典型的应用场景包括如下两种:将一个组件或者模块定义成两个或者两个以上程序集,一个程序集需要访问另一个程序集的Internal成员;对一个组件或者模块进行单元测试时候,单元测试用例需要调用定义在被测试组件或者模块的Internal成员。
阅读全文
posted @ 2010-10-06 17:05
Artech
阅读(6961)
推荐(14)
摘要:

个人觉得EnterLib的EHAB是一个不错的异常处理框架,借助于EHAB,我们可以配置的方式来自定义异常处理策略,从而带来最大的灵活性和可维护性。但是,在我看来,EHAB有一个最大的局限,就是异常处理策略的粒度过大——只能提供基于异常类型级别。本篇文章通过一个自定义异常处理器很好地解决了这个问题。
阅读全文
posted @ 2010-09-25 16:49
Artech
阅读(5930)
推荐(19)
摘要:

在上篇文章中我们谈到:当我们通过应用DependencyAttribute特性定义需要自动注入的属性的时候,当这个属性为接口、抽象类或者没有定义无参的构造函数,无论我们调用PIAB的Create方法去创建一个新的对象,还是调用Wrap方法对现有对象进行封装,都会抛出异常。如果说在前文中,我们还对这是否是个BUG抱着“谨慎”的态度,那么在这篇文章中,可以肯定地告诉你:这是一个BUG,而且是一个“致命”的BUG。
阅读全文
posted @ 2010-09-22 13:39
Artech
阅读(4885)
推荐(12)
摘要:

在《这是EnterLib PIAB的BUG吗?》一文中我们讨论了PIAB关于抽象基类的BUG,今天又发现了一个新的问题。问题的起因源于《IoC+AOP的简单实现》这篇文章,因为文中给出的解决方案仅仅支持构造器注入,而不能支持属性注入和方法注入——这是由于EnterLib的PIAB设计本身就存在缺陷。
阅读全文
posted @ 2010-09-20 22:44
Artech
阅读(4707)
推荐(6)
摘要:

在《上篇》中,我们实现了将保存有消息条目的XML向CodeDOM的转换.在下篇中,我们将实现整个代码生成系统的第二个步骤——通过VS扩展实现数据(保存消息条目的XML)向代码文件的自动转换。即通过VS自动生成的代码结构是对数据结构的反映,继而使我们能够强类型的方式操作数据,不但极大地提高开发效率,也降低了出错的可能。
阅读全文
posted @ 2010-09-18 02:05
Artech
阅读(9499)
推荐(18)
摘要:

这确实是一个让人觉得“无语”的BUG,甚至让我觉得微软在故意和我们开玩笑。这个问题在我刚刚接触WCF的时候就遇到过,换言之,这个问题一直存在于.NET 3.0、3.5和现在的4.0。这是一个关于在你对WCF进行扩展的时候会经常碰到的问题,读者朋友们可以根据下面的步骤来再现这一个问题。
阅读全文
posted @ 2010-09-16 20:34
Artech
阅读(7431)
推荐(17)
摘要:

我不知道大家对CodeDom的代码生成机制是否熟悉,但是有一点可以确定:如果你使用过VS,你就应该体验过它带给我们在编程上的便利。随便列举三种典型的代码生成的场景:强类型DataSet、Resource和添加Web Reference。总的来说,通过和VS集成的动态代码生成工具使我们可以“强类型”的方式进行编程,进而提供我们的效率并减低错误的几率。除了VS提供的这些典型的代码生成场景中,我们可以根据需要开发一些自定义代码生成器,并且通过VS的扩展实现后台代码的实时生成,从而实现强类型编程的目的。
阅读全文
posted @ 2010-09-16 00:05
Artech
阅读(13305)
推荐(39)
摘要:

在默认的情况下,EnterLib的PIAB采用基于透明/真实代理的机制实现对方法调用的拦截,进而实现了对横切关注点的动态注入。也正是其来截机制本身的局限,当我们才用PIAB的方式进行对象的创建的时候,要求对象的类型要么实现某一个接口,要么直接继承MarshalByRefObject类型。但不支持通过抽象基类对该类的间接继承,我个人觉得这是微软需要改进的地方。
阅读全文
posted @ 2010-09-15 12:46
Artech
阅读(3369)
推荐(12)