[14] 框架设计

摘要: 在《使用篇》中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离、多语言的支持和多验证规则的支持,我们现在来看看这样的验证解决方案最终是如何实现的。阅读全文
posted @ 2012-01-13 16:37 Artech 阅读(1385) | 评论 (11) 编辑
摘要: ASP.NET MVC提供一种基于元数据的验证方式是我们可以将相应的验证特性应用到作为Model实体的类型或者属性/字段上,但是这依然具有很多的不足。在这篇文章中,我结合EntLib的VAB的一些思想通过扩展为ASP.NET MVC提供一种更为完善的验证机制。阅读全文
posted @ 2012-01-12 13:42 Artech 阅读(1656) | 评论 (23) 编辑
摘要: EntLib的异常处理应用块(EHAB)是一个不错的异常处理框架,它使我们可以采用配置的方式来定义异常处理策略。而ASP.NET MVC是一个极具可扩展开发框架,在这篇文章中我将通过它的扩展实现与EntLib的集成,并提供一个完整的异常处理解决方案阅读全文
posted @ 2012-01-10 16:48 Artech 阅读(2888) | 评论 (29) 编辑
摘要: 在《集成EntLib实现ASP.NET MVC的异常处理》我们实现采用EntLib的Exception Handling Application Block(EHAB)进行异常的处理,并导向指定的出错页面。在这篇文章中我们做一些改变,直接将处理过的异常消息显示在本页的ValidationSummary中。阅读全文
posted @ 2011-12-14 16:54 Artech 阅读(1866) | 评论 (11) 编辑
摘要: 在项目开发中,我们会使用到很多的描述性文字,比如验证消息、错误消息和确认消息等,让这些文本消息具有可维护性具有重要的意义。在我们的项目开发中使用的是专门的一个维护消息的组件。在这篇文章中将会通过扩展现有的ValidationAttribute特性让ASP.NET MVC应用可以使用我们的消息组件来获取验证消息。阅读全文
posted @ 2011-12-14 10:45 Artech 阅读(2052) | 评论 (13) 编辑
摘要: 谈到IoC和ASP.NET的集成,很多人会先后想到Ninject,不过我们个人还是倾向于Unity。这篇文章简单地介绍如果创建基于Unity的ControllerFactory。阅读全文
posted @ 2011-12-13 16:35 Artech 阅读(2280) | 评论 (12) 编辑
摘要: 在《来源于WCF的设计模式:可扩展对象模式》我通过一个简单的例子介绍了基于IExtensibleObject和IExtension这两个接口为核心的“可扩展对象模式”。我之前是通过编程的方式来应用扩展对象的。其实,如何能够通过配置的方式来定义扩展,这个所谓的“可扩展对象模式”将会发挥更大的威力。阅读全文
posted @ 2011-09-29 14:12 Artech 阅读(1791) | 评论 (16) 编辑
摘要: 我一直很喜欢剖析微软一些产品、框架的底层实现。在我看来,这不但让我们可以更加深入地了解其运作的原理,同时也能提高设计/架构的技能。因为对于这些框架或者产品来说,高质量的设计是它们能够成功的一个最基本的因素。这些应用在这些产品和框架上的设计其实是最值得我们学习的设计案例。比如说,今天我们介绍的“可扩展对象模式”就来源于WCF。阅读全文
posted @ 2011-09-28 22:12 Artech 阅读(2997) | 评论 (18) 编辑
摘要: 为了解决EntLib的EHAB只能在异常类型级别控制异常处理策略的局限,我在很久之前曾经自定义了一个特殊的异常处理器来提供“细粒度”异常策略的定义。我个人觉得具有一定的实用价值,今天特意对其进行了重构,并将其放到了我在CodePlex上新创建的项目EntLib Extensions阅读全文
posted @ 2011-09-27 18:49 Artech 阅读(2183) | 评论 (5) 编辑
摘要: 今天写《WCF技术剖析(卷2)》关于《WCF扩展》一章,举了“如何通过WCF扩展实现与IoC框架(以Unity为例)集成”(《通过自定义ServiceHost实现对WCF的扩展[实例篇]》)的例子。为了展示Unity如何实现几种典型的注入方式(构造器注入、属性注入和方法注入),我写了一个简单的小程序。如果读者对Unity或者IoC没有太多概念,我觉得这个小程序对于你初步地认识它们具有一定的帮助意义。如果你对Unity或者IoC有深入的认识,请忽略本文。阅读全文
posted @ 2011-09-15 17:52 Artech 阅读(5577) | 评论 (33) 编辑
摘要: 当我们在设计一个框架的时候,必然会涉及一系列的配置。为了让使用者更好地使用你提供的框架,让他们能够容易地维护这些配置是一项基本的要求。对于一些配置过于复杂的框架,比如EnterLib,比如WCF,往往会提供一个配置的工具。但是,不过这样的配置工具是否提供,手工编译配置文件是在所难免的。如果在通过VS编辑配置的时候,能够提供智能感知和提示性描述的支持,这无疑会使配置的编辑变得非常的容易。这里是一个简单的例子。阅读全文
posted @ 2011-04-20 16:00 Artech 阅读(3713) | 评论 (25) 编辑
摘要: 《上篇》主要介绍如何通过DataBinder实现批量的数据绑定,以及如何解决常见的数据绑定问题,比如数据的格式化。接下来,我们主要来谈谈DataBinder的设计,看看它是如何做到将作为数据源实体的属性值绑定到界面对应的控件上的。阅读全文
posted @ 2011-03-27 21:19 Artech 阅读(6093) | 评论 (28) 编辑
摘要: 在《一句代码实现批量数据绑定》中,我通过界面控件ID与作为数据源的实体属性名之间的映射实现了批量数据绑定。由于里面频繁涉及对属性的反射——通过反射从实体对象中获取某个属性值;通过反射为控件的某个属性赋值,所以这不是一种高效的操作方式。为了提升性能,我通过IL Emit的方式创建了一个PropertyAccessor组件,以实现高效的属性操作。如果你看了我在文中给出的三种属性操作性能的测试结果,相信会对PropertyAccessor的作用有深刻的印象。阅读全文
posted @ 2011-03-24 21:23 Artech 阅读(3282) | 评论 (33) 编辑
摘要: 对于一个以数据处理为主的应用中的UI层,我们往往需要编写相当多的代码去实现数据绑定。如果界面上的控件和作为数据源的实体类型之间存储某种约定的映射关系,我们就可以实现批量的数据绑定。为了验证这种想法,我写了一个小小的组件阅读全文
posted @ 2011-03-23 22:53 Artech 阅读(5323) | 评论 (66) 编辑
摘要: 对于数据库设计来说,多对多(或者一对多)是一种常见的数据关系,比如联系人和地址之间的关系。我们通常采用建立关系表的方式来表示这种关系,比如我们创建一张表来存储联系人和地址之间的关系。如果我们最终需要通过存储过程的方式来维护他们之间的关系,该如何做呢?本篇文章给你一个具体的例子来演示如果采用存储过程来建立和删除实体之间的关系。阅读全文
posted @ 2011-03-16 16:41 Artech 阅读(2905) | 评论 (17) 编辑
摘要: 继续讨论EF中使用存储过程的问题,这回着重讨论的是为存储过程的参数进行赋值的问题。说得更加具体一点,是如何为实体映射的Delete存储过程参数进行赋值的问题。关于文中涉及的这个问题,我个人觉得是EF一个有待改进的地方,不知道各位看官是否同意?阅读全文
posted @ 2011-03-13 16:02 Artech 阅读(2908) | 评论 (6) 编辑
摘要: 本篇文章通过实例的方式,讨论两个在EF使用存储过程的主题:如何通过实体和存储过程的映射实现逻辑删除;对于具有自增长类型主键的数据表,在进行添加操作的时候如何将正确的值反映在实体对象上。阅读全文
posted @ 2011-03-13 00:13 Artech 阅读(2431) | 评论 (3) 编辑
摘要: 最近一段时间的工作任务是如何将EF引入到我们的开发框架,进行相应的封装、扩展,使之成为一个符合在特定场景下进行企业级快速开发的ORM。在此过程中遇到了一些挑战,也有一些心得。为了向大家分享这些心得,接下来我会写一系列相关的文章。第一个主题是关于在EF中使用存储过程的问题阅读全文
posted @ 2011-03-05 10:04 Artech 阅读(4220) | 评论 (27) 编辑
摘要: IoC的目的就是通过解析注册的依赖注入信息,最终创建出我们希望的某个对象。而只有通过配置的方式来定义IoC容器需要的注入信息,才能实现灵活的设计。所以,如果将两者集成起来,让IoC容器能够解析通过配置定义的“依赖注入”信息,具有很大的现实意义。接下来,我们将通过Unity为例,介绍IoC和自定义进行无缝集成的实现方案。阅读全文
posted @ 2011-01-20 20:40 Artech 阅读(3238) | 评论 (21) 编辑
摘要: 软件设计有一句话叫做“约定优于配置”,很多人将其作为拒绝配置的理由。但是,在很多场景中,配置是提供应用灵活度的首要甚至是唯一途径。对于框架的设计者来说,对于配置的驾驭是一项基本的技能。本篇文章通过一个简单而使用的例子,通过自定义配置的形式实现“插件式”设计。阅读全文
posted @ 2011-01-05 20:23 Artech 阅读(4694) | 评论 (58) 编辑
摘要: 之前写了两篇文章《.NET资源并不限于.ResX文件》(上篇、下篇),介绍了如何通过自定义ResourceManager的方式来扩展资源的存储形式。在本篇文章中我们将实现自定义ResourceManager和ASP.NET之间的集成,让ASP.NET现有的资源编程方式支持我们希望的资源存储方式。阅读全文
posted @ 2010-12-30 22:43 Artech 阅读(4020) | 评论 (20) 编辑
摘要: 在《上篇》中我们谈到ResourceManager在默认的情况下只能提供对内嵌于程序集的.resources资源文件的存取。为了实现对独立二进制.resources资源文件的支持,我们自定义了BinaryResoruceNManager。在本篇中我们还将创建两个自定义的ResourceManager,以实现对独立.resx资源文件和自定义结构的XML资源文件的支持。阅读全文
posted @ 2010-12-17 23:03 Artech 阅读(5343) | 评论 (25) 编辑
摘要: 为了构建一个轻量级的资源管理框架以满足简单的本地化(Localization)的需求,我试图直接对现有的Resource编程模型进行扩展。虽然最终没能满足我们的需求,但是这两天也算对.NET如何进行资源的存取进行了深入的学习,所以将我对此的认识通过博文的方式与诸位分享。在本篇文章中,我会通过自定义ResourceManager让资源的存储形式不仅仅局限于.ResX文件,你可以根据需要实现任意的存储方式,比如结构化的XML、数据库表,甚至是通过远程访问获取资源。阅读全文
posted @ 2010-12-16 21:47 Artech 阅读(4892) | 评论 (55) 编辑
摘要: 对于大部分企业应用来用,有一个基本的功能必不可少,那就是Audit Trail。我们采用它记录每一笔业务操作的基本信息,比如操作时间、操作者等。对于高安全级别的应用,我们甚至需要记录每笔业务操作引起的数据的改变。很多人都会想到采用触发器来实现,在这里介绍一种更好的方案:SQLCDC。阅读全文
posted @ 2010-11-20 00:50 Artech 阅读(6074) | 评论 (94) 编辑
摘要: 关于“验证框架”,先后推出了《编程篇》、《设计篇》和《改进篇》,本不打算再写《XXX篇》的。但是今天收到两个园友的短消息,想了解一下如何定义自己的验证规则,同时为了让本系列看起来完整,额外写了《扩展篇》收尾。本篇我们写一个简单的验证器,用于验证字符串类型属性成员的长度。阅读全文
posted @ 2010-10-15 20:42 Artech 阅读(1906) | 评论 (59) 编辑
摘要: 自《编程篇》和《设计篇》发布以来,收到了一些反馈,给了很大的启发。为此,我对这个“验证框架”进行了相应的改进,让CompositeValidator具有了解析“验证表达式”的能力。阅读全文
posted @ 2010-10-14 20:11 Artech 阅读(1777) | 评论 (46) 编辑
摘要: 没有想到自己头脑发热写了一个简陋版本的所谓“验证框架”能够得到众多网友的推荐。个人觉得这个验证框架有两个主要的特点是:提供复杂逻辑判断和多验证规则的支持。《编程篇》中,我主要介绍了如何通过自定义特性的方式进行验证规则的定义,在本篇中我主要来介绍该验证框架的设计原理和实现。阅读全文
posted @ 2010-10-13 21:17 Artech 阅读(1881) | 评论 (52) 编辑
摘要: 昨天晚上突发奇想,弄了一个简易版的验证框架,用于进行数据实体的验证。目前仅仅实现基于属性的声明式的验证,即通过自定义特性的方式将相应的Validator应用到对应的属性上,并设置相应的验证规则。在这里我们模拟一个有趣的场景来介绍这个迷你验证框架的使用:找对象,不论是找男朋友还是女朋友,还是不男不女的朋友,都具有一定的标准,在这里我们把这些标准表示成“验证规则”...阅读全文
posted @ 2010-10-12 16:50 Artech 阅读(3310) | 评论 (130) 编辑
摘要: 个人觉得EnterLib的EHAB是一个不错的异常处理框架,借助于EHAB,我们可以配置的方式来自定义异常处理策略,从而带来最大的灵活性和可维护性。但是,在我看来,EHAB有一个最大的局限,就是异常处理策略的粒度过大——只能提供基于异常类型级别。本篇文章通过一个自定义异常处理器很好地解决了这个问题。阅读全文
posted @ 2010-09-25 16:49 Artech 阅读(2731) | 评论 (30) 编辑
摘要: 在《这是EnterLib PIAB的BUG吗?》一文中我们讨论了PIAB关于抽象基类的BUG,今天又发现了一个新的问题。问题的起因源于《IoC+AOP的简单实现》这篇文章,因为文中给出的解决方案仅仅支持构造器注入,而不能支持属性注入和方法注入——这是由于EnterLib的PIAB设计本身就存在缺陷。阅读全文
posted @ 2010-09-20 22:44 Artech 阅读(2259) | 评论 (29) 编辑
摘要: 在默认的情况下,EnterLib的PIAB采用基于透明/真实代理的机制实现对方法调用的拦截,进而实现了对横切关注点的动态注入。也正是其来截机制本身的局限,当我们才用PIAB的方式进行对象的创建的时候,要求对象的类型要么实现某一个接口,要么直接继承MarshalByRefObject类型。但不支持通过抽象基类对该类的间接继承,我个人觉得这是微软需要改进的地方。阅读全文
posted @ 2010-09-15 12:46 Artech 阅读(2345) | 评论 (26) 编辑
摘要: 对EnterLib有所了解的人应该知道,其中有一个名叫PIAB的AOP框架;而整个EnterLib完全建立在另一个叫作Unity的底层框架之上,我们可以将Unity看成是一个IoC的框架。对于一个企业应用来说说,AOP和IoC是我们进行逻辑分离和降低耦合度最主要的方式,而将两者结合起来具有重要的现实意义。阅读全文
posted @ 2010-09-01 20:11 Artech 阅读(9462) | 评论 (97) 编辑
摘要: 这是一张大体反映Unity 2.0下关于AOP(Interception)设计的类图...阅读全文
posted @ 2010-08-27 12:11 Artech 阅读(1246) | 评论 (6) 编辑
摘要: 之前园子里也有一些介绍企业库的文章,其中也不乏对Unity的介绍。虽然微软官方声称其为轻量级的IoC框架,但是并不意味着Unity会很简单。相反,也正是因为复杂性,很多人撰文介绍Unity的时候,往往为了面面俱到,导致很多读者不知所云。最终的结果是,了解Unity的读者能够看懂,不懂的人读了还是不懂。在本篇文章中,我试着换一种介绍方式:抓住Unity最本质的东西,剔除一些细枝末节,希望以一种全新的视角让读者了解Unity的本质。阅读全文
posted @ 2010-07-13 22:39 Artech 阅读(7332) | 评论 (51) 编辑
摘要: 经常在网上看到对ORM的讨论沸沸扬扬,我也来凑个热闹,谈谈我写的一个ORM。最近在做一项工作,把我们经常用到的一些业务逻辑抽象出来,写成一个个的Application Block,使之可以运用到不同的Application中,比如Data Access,Messaging,Auditing,Data binding等等。现在先做一个Data access application block。由于时间仓促,没有进行什么优化和较多的测试,大家不必深究我所提供的Code ,我只希望为大家的ORM提供另一种想法。阅读全文
posted @ 2007-04-03 18:54 Artech 阅读(4387) | 评论 (11) 编辑