摘要:

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

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

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

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

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

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

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

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

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

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

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

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

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

这是一个大得能把牛吓死的话题。上周公司为我们进行企业核心价值(Core Value)的培训,让我们每人写出3条个人价值观。对于这个问题,我之前还真没有人证思考过——到底我的人生信条是什么呢?想了半天,写出了以下三条:
阅读全文
posted @ 2010-09-13 19:46
Artech
阅读(4187)
推荐(20)
摘要:

洪雅于隋开皇十三年(公元593年)建县,距今已有1400多年历史,地处四川盆地西南边缘,属中亚热带湿润气候,年降雨量1435.5毫米,年日照1006.1小时,年无霜期312天,年平均气温16.6℃。地形由西南向东北呈高低梯次变化,素有“七山二水一分田”之称。最高海拔3522米(瓦屋山旅游区内),最低海拔420米(洪雅县城)。洪雅有个中国最大的国家级森林公园——瓦屋山森林公园;有个四川十大古镇之一的柳江古镇;有毗邻峨眉山的独家胜地——七里坪国际避暑度假区;有四川第二大湖泊——汉王湖;有种独特的江峡风光——槽渔滩风景名胜区;有个世界最大的山顶平台——瓦屋山顶大平台...
阅读全文
posted @ 2010-09-12 14:20
Artech
阅读(5530)
推荐(5)
摘要:

但是今天发现一个叫做“学IT网”的站点(http://www.xueit.com/),里面转载了博客园几乎所有的技术文章,但是除了表明文章来源于博客园之外,所有文章的作者均被写成“编辑整理”。我不知道该网站是否得到了博客园的授权,即便是得到了授权,有何理由改变博文的署名呢?
阅读全文
posted @ 2010-09-11 20:39
Artech
阅读(5722)
推荐(41)
摘要:

由于我们的项目底层使用到一个通过LogicalCallContext实现的上下文数据管理框架,导致所有的Unit Test不能正常运行。具体的现象在《只在UnitTest和WebHost中的出现的关于LogicalCallContext的严重问题》有过详细的介绍。解决的方案就是对相关的程序集进行强签名,并加到GAC中。程序集签名很好实现——仅仅需要借助VS给项目指定一个签名用的Key File就可以了,但是,VS做得不够好。
阅读全文
posted @ 2010-09-10 23:32
Artech
阅读(8856)
推荐(10)
摘要:

2010年3月5 日,微软全球CEO 史蒂夫.鲍尔默先生在美国华盛顿大学发表演讲时指出,微软将举全公司之力投入云计算。“我们将把赌注押在云计算领域。”——他表示,此次演讲旨在让人们从更广阔的角度来看待云计算,并由多个维度来了解云计算所带来的变革。和业内许多公司一样,微软认为云技术的革新攸关未来,从5个维度分享了微软对云计算的理解以及微软在相关领域的创新情况。
阅读全文
posted @ 2010-09-10 09:45
Artech
阅读(2761)
推荐(3)
摘要:

关于如何解决分布式系统中的跨时区问题,上一篇详细介绍了解决方案的实现原理。尽管《原理篇》中介绍了那么多,解决方案的本质就是:在进行服务调用过程中将客户端的时区信息作为上下文传入服务端,并以此作为时间转换的依据。在这一篇中我们根据这个原理通过一个简单的例子来证明其可行性。。
阅读全文
posted @ 2010-09-10 00:23
Artech
阅读(5896)
推荐(6)
摘要:

《谈谈你最熟悉的System.DateTime[上篇][下篇]》从跨时区的角度对DateTime这个我们熟知的类型进行了深入探讨,它们都是为这篇文章作的准备工作。在接下来的两篇文章中,我们将完整的介绍如果在一个分布式系统中处理时区的问题。
阅读全文
posted @ 2010-09-08 23:50
Artech
阅读(9758)
推荐(11)
摘要:

在《谈谈你最熟悉的DateTime》一文中,我们从跨时区的角度剖析了我们熟悉的时间类型。如果你采用传统的ADO.NET编程,并用DataSet作为数据实体,可能你会熟悉DataSetDateTime这个类型。这个类型也是为实现跨时区场景设计的,为了对前文的补充,这篇文章就来谈谈基于DataSet的时间处理问题。
阅读全文
posted @ 2010-09-05 11:24
Artech
阅读(7949)
推荐(20)
摘要:

最近一直在负责公司内部框架的升级工作,今天对一个小问题进行了重新思考——时间的处理。具体来说,是分布式应用中如何有效地进行时间的处理以提供对跨时区的支持。不过,对该问题解决方案的介绍我会放在后续的文章中,在这里我们先来介绍一些基础性的内容——谈谈我们熟悉的DateTime类型
阅读全文
posted @ 2010-09-04 10:16
Artech
阅读(16835)
推荐(72)
摘要:

对EnterLib有所了解的人应该知道,其中有一个名叫PIAB的AOP框架;而整个EnterLib完全建立在另一个叫作Unity的底层框架之上,我们可以将Unity看成是一个IoC的框架。对于一个企业应用来说说,AOP和IoC是我们进行逻辑分离和降低耦合度最主要的方式,而将两者结合起来具有重要的现实意义。
阅读全文
posted @ 2010-09-01 20:11
Artech
阅读(28852)
推荐(78)
摘要:

在前一篇文章中我曾经说过,现在正在做一个小小的框架以实现采用统一的API实现对上下文(Context)信息的统一管理。这个框架同时支持Web和GUI应用,并支持跨线程传递和跨域传递,和对上下文项目的读写控制。在对后两个特性的支持上,出现一个小小的关于序列化的问题。解决方案只需要改动短短的一行代码,结果却让我折腾了老半天...
阅读全文
posted @ 2010-08-31 20:16
Artech
阅读(6655)
推荐(15)
摘要:

最近一直在进行公司内部框架的升级工作,其中一个小的部分就是通过HttpSessionState和CallContext建立一套统一的、可扩展的用于管理上下文信息的框架。在为写好的程序编写Unit Test和QuickStart的时候,遇到了两个基于LogicalCallContext的严重问题。导致这两个问题的根源还没有来得及去追踪,或许是微软VS Unit Test框架本身和WebHost本身的一个Bug。现在将其写出来,一来是希望读者在遇到相同情况的时候知道LogicalCallContext可能是影响因素之一,另一方面也希望借助社区的力量快速找到问题的症结。
阅读全文
posted @ 2010-08-29 00:59
Artech
阅读(3636)
推荐(7)
摘要:

这是一张大体反映Unity 2.0下关于AOP(Interception)设计的类图...
阅读全文
posted @ 2010-08-27 12:11
Artech
阅读(2284)
推荐(1)
摘要:

自从公司搬到国际科技园五期之后,就开始坐班车上班了。随着入住公司越来越多,班车的车次却始终保持不变,所以班车变得越来越挤。对于上下班的高峰期,后面几个站点的人根本就上不了车。为了避开高峰期,我一般都会选择坐稍早那一班上下班。由于这几天一直在培训公司刚刚招聘的新人,培训在九点开始,去早了也没有太大的意义,所以选择坐上班高峰期的那班车......
阅读全文
posted @ 2010-08-25 22:20
Artech
阅读(3763)
推荐(3)
摘要:

有一次和人谈起关于事务的话题,谈到怎样的资源才能事务型资源。除了我们经常使用的数据库、消息队列、事务型文件系统(TxF)以及事务性注册表(TxR)等,还有那些资源直接可以纳入事务进行状态的管理呢?我说如果我们按照.NET事务模型的规范对相应的资源进行合理的封装,原则上我们可以让任何可编程的资源成为事务型资源。本篇文章中,我将通过简单的编程将一个普通的变量变成支持事务,让变量的值也可以回滚,以确保事务前后的数据一致性。
阅读全文
posted @ 2010-08-16 22:09
Artech
阅读(10505)
推荐(40)
摘要:

照理说随着年纪的增加,一个人的情绪控制能力会随之增强。随着阅历的增加,心智的增强,会帮助一个更加“从容”地面对顺境与逆境——我一直觉得人生的最高境界就是“从容”二字)。同时也会使一个人能够一种包容的心态去看待和处理生活中一些“看不惯”的事情,而不会使这些影响自己的情绪。但是,我觉得自己年纪越大,却越来越激愤。每次看到一些不公、丑陋、恶心的事情,自己总是难以忍受,习惯性地表现出一些“过激”的行为。以下随便列举出一些事件......
阅读全文
posted @ 2010-08-14 23:50
Artech
阅读(3744)
推荐(7)
摘要:

《天使之恋》是我最近看的一部电影,剧情大体是这样的:性格独立、长相可爱的女高中生理央内心有着无法抹去的阴影。由于这段惨痛的过去,她变得无法相信任何人,她只对金钱感兴趣,而且从来不和对自己没用的人交往。在17岁生日那天,理央邂逅了35岁的大学讲师光辉,有此坠入爱河。理央开始懂得如何去爱别人,渐渐发生了蜕变。然而命运却不愿让理央顺利获得重生。光辉虽然也爱理央,却无法接受她的爱....
阅读全文
posted @ 2010-08-13 22:47
Artech
阅读(13936)
推荐(3)
摘要:

WCF是一个具有极高扩展度的分布式通信框架。在WCF众多可扩展点中,CallContextInitializer可以帮助我们在服务操作执行前后完成一些额外的功能,这实际上就是一种AOP的实现方式。昨天,李永京同学问了我一个相关的问题,由此发现了一个基于自定CallContextInitializer的WCF扩展的严重问题。
阅读全文
posted @ 2010-07-27 12:15
Artech
阅读(4371)
推荐(7)
摘要:

之前园子里也有一些介绍企业库的文章,其中也不乏对Unity的介绍。虽然微软官方声称其为轻量级的IoC框架,但是并不意味着Unity会很简单。相反,也正是因为复杂性,很多人撰文介绍Unity的时候,往往为了面面俱到,导致很多读者不知所云。最终的结果是,了解Unity的读者能够看懂,不懂的人读了还是不懂。在本篇文章中,我试着换一种介绍方式:抓住Unity最本质的东西,剔除一些细枝末节,希望以一种全新的视角让读者了解Unity的本质。
阅读全文
posted @ 2010-07-13 22:39
Artech
阅读(18752)
推荐(70)
摘要:

最近园子里发表了一些讨论“事件(Event)”的文章,我也来凑个热闹,谈谈我对事件的一些粗浅的认识。本文不谈设计模式(主要是观察者模式),只从运行时的角度来分析事件这个对象到底是个什么东西?它有那么神秘吗?为了更好的分析事件,本文将会编写一些例子来模拟事件的订阅机制。本文对事件的分析可以概括为下面三句话:1.事件本质上是一个MulticastDelegate对象; 2.MulticastDelegate对象是多个Delegate对象的链表;3.Delegate = Object + MethodInfo,委托的执行最终通过反射来完成。
阅读全文
posted @ 2010-07-10 13:56
Artech
阅读(12008)
推荐(34)
摘要:

对于任何一个企业级应用来说,安全都是一个不可回避的话题。如何识别用户的身份?如何将用户可执行的操作和可访问的资源限制在其允许的权限范围之内?如何记录用户行为,让相应的操作都有据可查?这些都是应用的安全机制或者安全框架需要考虑的典型问题,它们分别对应着三个安全行为:认证、授权和审核。作为Windows平台下最完备的分布式通信平台,WCF具有一套强大的、完整的的可扩展安全体系,对上述的安全问题提供有效的支持。由于安全体系在整个WCF框架体系中具有极其重大的分量,在接下来的系列文章中,我将深入探讨这一块在我之前的文章中一直不曾触碰的境地
阅读全文
posted @ 2010-07-07 00:13
Artech
阅读(7536)
推荐(16)
摘要:

Windows Communication Foundation (WCF) 中的可靠会话使用传输窗口保存客户端和服务上的消息。可配置属性 MaxTransferWindowSize 指示传输窗口可以保存多少条消息。在发送方,这指示在等待确认消息时传输窗口可以保存多少条消息,在接收方,则指示为服务缓冲多少条消息。选择合适的大小可影响使用网络的效率以及运行服务的最佳容量。
当编写一个允许从不同的客户端启用可靠会话通信的服务时,可能会有许多客户端同时建立与该服务的可靠会话。在这些情况下,服务的响应取决于 MaxPendingChannels 属性。当发送方创建到接收方的可靠会话通道时,发送方和接收方之间的握手将建立可靠会话。建立可靠会话之后,该通道会放入到挂起的通道队列中以供服务接受。此 MaxPendingChannels 属性指示有多少个通道可以处于此状态。
阅读全文
posted @ 2010-06-30 22:18
Artech
阅读(3901)
推荐(1)
摘要:

我每日坐5路地铁,从伽尼一站出来,都会看到一个没有头的人坐在路边,不时发出些古怪声响,引得途人侧目,他的面前,摆了只扁盒子,零散会有人丢几个硬币进去。
于这城里,这类表演是常见,无非是把肩下垫得很高,头缩下去,便看来效果了。尽管人皆心知肚明,但不免当下兴致,还有支付;或是孩子,不明就里,好奇大作,每每观析过多,父母不过意,扔几枚意思。
一日里,我一样经过这没有头的人,却有几个警察也过来,和他说了些什么。就在身旁,我不觉听了一下,大约是自这一日,上面下了新的时令,便是不得在街上行演了。
无头的人便释解起来,说是平日只是老实地坐在那里,并不妨碍行人;受来多少,任人自愿,从没纠缠;且是每日里收工,也把原地打扫一二,不留丝毫垃圾再去……。声音闷声闷气,从领子的洞里传出。
阅读全文
posted @ 2010-05-15 11:22
Artech
阅读(5664)
推荐(2)
摘要:

作为一个通信基础平台,WCF必须保证通信的可靠性。由于消息交换是WCF采用的通信手段,通信可靠性的保障体现在确保消息的可靠传输。由于网络环境的限制,网络层不能百分之百地确保对消息的有效交付。如何克服中间环节的制约,确保从一端发送的消息能够被有效地交付给另一端,这就是可靠消息传输需要解决的问题。WCF通过可靠会话实现了种种端到端的可靠消息传输。
阅读全文
posted @ 2010-05-13 21:20
Artech
阅读(14012)
推荐(26)
摘要:

上面一部分我们站在信道层的角度剖析了WCF为了实现可靠会话在信道层进行的一系列消息交换,或者说客户端和服务端的RS信道为了实现可靠消息传输所进行一轮又一轮的握手。这一切都是基于这样一个假设:两个RS信道均可以在适当的时机向对方发送消息,或者说两个RS信道之间是一个双工的通道。 如果我们站在传输层看待这个问题,该假设对于TCP传输是成立的,但是对于HTTP来说就有点问题了。HTTP本身就是一个基于请求|回复消息交换模式的应用层网络协议,并不能对双工通信提供支持。
阅读全文
posted @ 2010-05-05 21:21
Artech
阅读(5426)
推荐(7)
摘要:

本系列先后通过《实例篇》、《概念篇》、《协议篇》和《编程篇》对WCF的可靠会话进行了详细探讨。作为本系列的最后一片,我们将深入到WCF的可靠会话体系的最底层,对实现可靠会话的实现原理进行深入剖析。如果读者仔细阅读本系列博文,相信会使读者对可靠会话的理解提升到一定的高度。
从《编程篇》中,我们不难看出可靠会话的编程仅仅围绕着一个对象,那就是绑定。绑定在整个WCF架构模型具有重要的地位。WCF整个架构模型由两部分构成,即服务模型(Service Model)层和信道(Channel)层,而绑定是信道层的缔造者,同时也是连接两个层次的纽带。对可靠会话的实现,是完全在信道层实现的。
阅读全文
posted @ 2010-05-04 23:52
Artech
阅读(5367)
推荐(10)