摘要: 上篇介绍了Util的开发环境,并让你把Demo运行起来。本文将介绍该Demo的前端Angular运行机制以及目录结构。 目录结构 在VS上打开Util Demo,会看见如下的目录结构。 现代前端通常采用VS Code开发,不过我们为了使用TagHelper,需要采用VS开发,这为你提供了更多的选择。阅读全文
posted @ 2018-09-17 14:49 何镇汐 阅读(1718) 评论(18) 编辑
摘要: Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util的代码放进你的框架,放心使用。 Util的命名 Util这个名字看上去不怎么高大上,很多人劝我换个霸阅读全文
posted @ 2018-09-07 13:29 何镇汐 阅读(2432) 评论(31) 编辑
摘要: 距离上次发文,已经过去了三年半,这几年技术更新节奏异常迅猛,.Net进入了跨平台时代,前端也被革命性的颠覆。 回顾 2015年,正当我还沉迷于JQuery + EasyUi的封装时,突然意识到技术已经过时。 JQuery在面对更加复杂的UI需求时显得力不从心,EasyUi虽然组件比较完善,但界面风格阅读全文
posted @ 2018-09-04 14:06 何镇汐 阅读(4083) 评论(58) 编辑
摘要: 上篇介绍了Util的开发环境,并让你把Demo运行起来。本文将介绍该Demo的前端Angular运行机制以及目录结构。 目录结构 在VS上打开Util Demo,会看见如下的目录结构。 现代前端通常采用VS Code开发,不过我们为了使用TagHelper,需要采用VS开发,这为你提供了更多的选择。阅读全文
posted @ 2018-09-17 14:49 何镇汐 阅读(1718) 评论(18) 编辑
摘要: Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util的代码放进你的框架,放心使用。 Util的命名 Util这个名字看上去不怎么高大上,很多人劝我换个霸阅读全文
posted @ 2018-09-07 13:29 何镇汐 阅读(2432) 评论(31) 编辑
摘要: 距离上次发文,已经过去了三年半,这几年技术更新节奏异常迅猛,.Net进入了跨平台时代,前端也被革命性的颠覆。 回顾 2015年,正当我还沉迷于JQuery + EasyUi的封装时,突然意识到技术已经过时。 JQuery在面对更加复杂的UI需求时显得力不从心,EasyUi虽然组件比较完善,但界面风格阅读全文
posted @ 2018-09-04 14:06 何镇汐 阅读(4083) 评论(58) 编辑
摘要: 进行项目开发的第一步,是创建出适合自己团队习惯的VS解决方案,虽然我已经提供了项目示例,但毕竟是我创建的,你直接使用可能并不合适,另外你如果尝试模仿重新创建该示例,中间可能碰到各种障碍,特别是项目间的依赖关系。 本文的目的是帮助.Net架构初学者能顺利搭建起适合自己的VS解决方案,我会在本文演...阅读全文
posted @ 2015-05-26 01:45 何镇汐 阅读(9992) 评论(71) 编辑
摘要: 离上一篇又过去了一个月,时间比较紧,后续估计会更紧,所以这次将放出更多公共操作类及配套的CodeSmith模板,本篇将简要介绍新放出的重要功能,供有兴趣的同学参考。重要更新 这一次对两个VS解决方案均做了大量调整,包含项目结构及命名空间。 Util解决方案的目录截图如下。 除了少数需要配置...阅读全文
posted @ 2015-05-20 23:09 何镇汐 阅读(8603) 评论(111) 编辑
摘要: 从本篇开始,本系列将进入实战演练阶段。 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠。不过我的精力很有限,文章进度越来越慢,所以准备切换一下介绍顺序,把实战演练提前,以方便你阅读代码。实战演练介绍 本系列实...阅读全文
posted @ 2015-04-19 23:20 何镇汐 阅读(7296) 评论(58) 编辑
摘要: 上一篇介绍了我对几种实体的认识,本篇将介绍几种服务的用法。 预告一下本系列后续计划,本篇之后,准备进入实战演练阶段,先介绍如何快速解决CRUD操作,从如何使用PD数据建模到使用CodeSmith生成代码,先带你感受一下,再回过来介绍框架内部元素,以免你在阅读时昏昏欲睡。应用服务介绍 对于一个...阅读全文
posted @ 2015-04-08 23:02 何镇汐 阅读(6560) 评论(49) 编辑
摘要: 本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较。领域实体为何不能一统江湖? 当你阅读我或其它博主提供的示例代码时,会发现几种类型的实体,这几种实体初步看上去区别不大,只是名称不同,...阅读全文
posted @ 2015-03-31 01:05 何镇汐 阅读(8997) 评论(64) 编辑
摘要: 最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间。不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新。本文继续介绍表现层和Asp.net Mvc,我将在本篇讨论一些重要的设计问题和封装技巧。是否需要将控制器分离为独立项目 经常有人问我,是否有必要将控制器从W...阅读全文
posted @ 2015-03-16 16:11 何镇汐 阅读(7091) 评论(64) 编辑
摘要: 本文将介绍表现层及ASP.NET MVC的一些要点,特别是ASP.NET MVC的一些抽象和封装技巧,如果你对MVC还不了解,可以参考《ASP.NET MVC4 高级编程》,作者Jon Galloway等,这本书由ASP.NET MVC团队成员编写,相当不错。表现层的职责 表现层的职责是展示和...阅读全文
posted @ 2015-02-02 19:56 何镇汐 阅读(3596) 评论(23) 编辑
摘要: 上文介绍了我选择EasyUi作为前端框架的原因,并发放了最新Demo。本文将对这个Demo进行一些介绍,以方便你能够顺利运行起来。 这个Demo运行起来以后,是EasyUi的一个简单CRUD操作,数据库中也只有一个简单的表,整个操作不带任何业务逻辑。 看到这里,不少朋友难免感到失望,搞这么复...阅读全文
posted @ 2015-01-30 14:57 何镇汐 阅读(4664) 评论(27) 编辑
摘要: 对于BS管理系统,我很长一段时间都工作在Asp.Net Web Form上,Web Form的主要优势是可以使用服务器端控件,以类似CS的开发模式进行工作,通过拖拽控件和定义事件处理函数,极大的简化了BS的开发。服务器端控件会在渲染阶段把自身输出为Html标签,对我们完全透明,当需要设置相关属性...阅读全文
posted @ 2015-01-27 14:59 何镇汐 阅读(9019) 评论(251) 编辑
摘要: 今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误。 我增加了几个单元测试来捕获错误,代码如下。 /// /// 测试值为枚举 /// [TestMethod] ...阅读全文
posted @ 2015-01-24 02:22 何镇汐 阅读(3010) 评论(6) 编辑
摘要: 信息系统的查询需求千变万化,在仓储中为每个查询需求创建一个特殊方法,将导致大量乏味而臃肿的接口。 一种更加可行的办法是,在应用层服务中描述查询需求,并通过仓储执行查询。 为了能够更好的描述查询需求,可以将查询功能从仓储中抽取出来,专门创建一个查询对象。 查询最复杂的部分是条件过滤,这也是查...阅读全文
posted @ 2015-01-20 22:24 何镇汐 阅读(2745) 评论(4) 编辑
摘要: 前面已经做了一些准备工作,本篇将介绍查询条件的封装,它是规约模式的一个应用。 规约使用一个对象来封装谓词,我之前已经介绍过它在验证方面的应用,本篇是规约模式在查询方面的应用。 规约的强大之处在于,能够将一堆杂乱无章的条件判断或查询条件封装起来,以一个清晰的概念来表达,并使得这些谓词具备了可复...阅读全文
posted @ 2015-01-20 01:26 何镇汐 阅读(3519) 评论(14) 编辑
摘要: 本篇介绍的表达式生成器,用于动态创建表达式。 在Util项目Lambdas目录中,添加ExpressionBuilder,代码如下。using System;using System.Linq.Expressions;namespace Util.Lambdas { /// //...阅读全文
posted @ 2015-01-06 19:29 何镇汐 阅读(1745) 评论(1) 编辑
摘要: 当你使用可空的值类型时,你会发现取值很不方便,比如Guid? obj,你要从obj中获取值,可以使用Value属性obj. Value,但obj可能为null,这时候就会抛出一个异常。 可空值类型提供了一个HasValue属性,它可以识别出obj是不是一个null值,每当你获取可空值都需要加上...阅读全文
posted @ 2015-01-06 19:02 何镇汐 阅读(1470) 评论(5) 编辑
摘要: 上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展。 修改Util项目的Extensions.Expression.cs文件,代码如下。using System;using System.Linq;using System.Linq.Express...阅读全文
posted @ 2015-01-06 18:32 何镇汐 阅读(1420) 评论(4) 编辑
摘要: 前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类。 Lambda表达式公共操作类,我在前面已经简单介绍过,要么从Lambda表达式中获取信息,要么动态创建Lambda表达式,本篇直接贴代码,如果发...阅读全文
posted @ 2015-01-06 18:09 何镇汐 阅读(1665) 评论(12) 编辑
摘要: 上一篇介绍了IQueryable的Where方法存在的问题,并扩展了一个名为Filter的过滤方法,它是Where方法的增强版。本篇将介绍查询的另一个重要主题——分页与排序。 对于任何一个信息系统,查询都需要分页,因为不可能直接返回表中的所有数据。 如果直接使用原始的Ado.Net,我们可以...阅读全文
posted @ 2015-01-03 21:08 何镇汐 阅读(3094) 评论(11) 编辑
摘要: 上面两篇已经作好准备,本文将进行基础查询扩展。当使用了Entity Framework这样的ORM框架以后,我们查询的核心被集中在IQueryable的Where方法上。 如果UI需要通过姓名查询一个客户,会在UI上放置一个输入框作为客户姓名的查询条件。服务端接收以后通过Where方法进行过滤...阅读全文
posted @ 2014-12-25 13:25 何镇汐 阅读(3540) 评论(14) 编辑
摘要: 前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务。 Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递。在Linq中,大量使用Lambda表达式进行查询,不过这种Lambda表达式被Expression包装成表达式树。表达式...阅读全文
posted @ 2014-12-24 13:54 何镇汐 阅读(2485) 评论(8) 编辑
摘要: 前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类。 很多时候,我们会判断一个对象是否为null,由于null是一个不能接受的值,它会导致“未将对象引用设置到对象的实例”的严重错误,所以当检测...阅读全文
posted @ 2014-12-22 23:57 何镇汐 阅读(2958) 评论(3) 编辑
摘要: 前一篇介绍了仓储的基本概念,并谈了我对仓储的一些认识,本文将实现仓储的基本功能。 仓储代表聚合在内存中的集合,所以仓储的接口需要模拟得像一个集合。仓储中有很多操作都是可以通用的,可以把这部分操作抽取到基类中。 在Util.Domains项目中创建一个文件夹Repositories,这个文件夹...阅读全文
posted @ 2014-12-17 17:00 何镇汐 阅读(4169) 评论(12) 编辑
摘要: 前面已经介绍过Entity Framework的工作单元和映射层超类型的封装,从本文开始,将逐步介绍仓储以及对查询的扩展支持。 什么是仓储 仓储表示聚合的集合。 仓储所表现出来的集合外观,仅仅是一种模拟,除了测试以外,没有理由使用内存中真正的...阅读全文
posted @ 2014-12-12 11:59 何镇汐 阅读(4331) 评论(34) 编辑
摘要: 上一篇介绍了工作单元层超类型的封装演化过程,本文将介绍对Entity Framework映射层超类型的封装。 使用Entity Framework一般需要映射三种类型的对象,即实体、聚合、值对象。 聚合与实体映射的主要区别是:聚合映射单属性标识Id,并需要映射乐观离线锁Version,而实体...阅读全文
posted @ 2014-12-08 18:55 何镇汐 阅读(3157) 评论(1) 编辑
摘要: 上一篇介绍了DDD聚合以及与并发相关的各种锁机制,本文将介绍另一个核心元素——工作单元,它是实现仓储的基础。 什么是工作单元 维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。 这是《企业应用架构模式》中给出的定义,不过看上去有...阅读全文
posted @ 2014-12-06 21:10 何镇汐 阅读(3777) 评论(6) 编辑
摘要: 前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题。 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚,并为你提供业务逻辑的唯一访问点。而聚合则是第二步,它将多个相关业务概念包装到单一的概念中,从而...阅读全文
posted @ 2014-12-04 04:10 何镇汐 阅读(7024) 评论(25) 编辑
摘要: 上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见。这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践。但是设计与实践的好与坏,对于不同的人,以及处于不同的环境都有不同的诠释,这是一个仁者见仁,智者见智的问题。DDD非常抽象,以至...阅读全文
posted @ 2014-11-27 19:33 何镇汐 阅读(4043) 评论(5) 编辑
摘要: 前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持。本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分。 如果说你已经在使用DDD分层架构,但你却从来没有使用过值对象,这毫不奇怪,因为多年来养成的数据建模思维已经牢牢把你禁锢,以致于你在使用面向对象方...阅读全文
posted @ 2014-11-25 20:26 何镇汐 阅读(6263) 评论(32) 编辑
摘要: 在应用程序框架实战十四:DDD分层架构之领域实体(基础篇)一文中,我介绍了领域实体的基础,包括标识、相等性比较、输出实体状态等。本文将介绍领域实体的一个核心内容——验证,它是应用程序健壮性的基石。为了完成领域实体的验证,我们在前面已经准备好了验证公共操作类和异常公共操作类。 .Net提供的Da...阅读全文
posted @ 2014-11-20 23:43 何镇汐 阅读(6828) 评论(25) 编辑
摘要: 任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务上的错误进行简单支持。 对于刚刚接触.Net的新手,碰到错误的时候,一般喜欢通过返回bool值的方式指示是否执行成功。public bool 方法名() { //执行代码,成功返回true,否则返回false} 不过上面的方法...阅读全文
posted @ 2014-11-19 11:52 何镇汐 阅读(4538) 评论(18) 编辑
摘要: 为了能够验证领域实体,需要一个验证公共操作类来提供支持。由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点。 .Net提供了一个称为DataAnnotations的验证技术,即在对象的属性上添加一些Attribute,比如...阅读全文
posted @ 2014-11-18 23:22 何镇汐 阅读(5080) 评论(19) 编辑
摘要: 上一篇,我介绍了自己在DDD分层架构方面的一些感想,本文开始介绍领域层的实体,代码主要参考自《领域驱动设计C#2008实现》,另外参考了网上找到的一些示例代码。什么是实体 由标识来区分的对象称为实体。 实体的定义隐藏了几个信息:两个实体对象,只要它们的标识属性值相等,哪怕标识属性以外的所有属...阅读全文
posted @ 2014-11-17 18:54 何镇汐 阅读(6735) 评论(17) 编辑
摘要: 前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示。下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持。你不一定要使用DDD这样的架构,使用单层架构和普通三层架构一样可以,不过你如果希望获得更进一步的复用性和封装度,使用更加面向对...阅读全文
posted @ 2014-11-14 20:25 何镇汐 阅读(8535) 评论(31) 编辑
摘要: 上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化。 下面以字符串转换为List为例进行讨论。string input = "83B0233C-A24F-49FD-8083-1337209EBC9A,EA...阅读全文
posted @ 2014-11-13 14:01 何镇汐 阅读(4566) 评论(10) 编辑
摘要: 上一篇介绍了数据类型转换的一些情况,可以看出,如果不进行封装,有可能导致比较混乱的代码。本文通过TDD方式把数据类型转换公共操作类开发出来,并提供源码下载。 我们在 应用程序框架实战十一:创建VS解决方案与程序集 一文已经创建了解决方案,包含一个类库项目和一个单元测试项目。单元测试将使用.Ne...阅读全文
posted @ 2014-11-12 17:28 何镇汐 阅读(5709) 评论(14) 编辑
摘要: 本系列文章将介绍一些对初学者有帮助的辅助类,这些辅助类本身并没有什么稀奇之处,如何能发现需要封装它们可能更加重要,所谓授之以鱼不如授之以渔,掌握封装公共操作类的技巧才是关键,我会详细说明创建这些类的动机和思考过程,以帮助初学者发现和封装自己需要的东西。创建公共操作类的技巧,大家可以参考我的这篇文...阅读全文
posted @ 2014-11-11 18:28 何镇汐 阅读(6302) 评论(12) 编辑
摘要: 本文专门为初学者而写,因为很多初学者可能还不了解公共操作类的作用和封装技巧,大部分有经验的程序员都会把自己所碰到的技术问题整理封装成类,这就是公共操作类。公共操作类往往具有一些通用性,也可能专门解决某些棘手问题。公共操作类是应用程序框架的核心,主要目标是解决大部分技术问题。我将在本文介绍封装公共...阅读全文
posted @ 2014-11-10 05:11 何镇汐 阅读(7117) 评论(19) 编辑
摘要: 上一篇,介绍了开发环境需要的工具和版本,本篇将动手创建VS解决方案。 对于本系列文章提供的示例,我想通过两种途径来演示,一种是单元测试,另外为了能更直观的看到效果,还会提供一个用户界面来展示。为了不分散注意力,前期只提供非常简陋的原始界面,后期如果有时间的话,我想使用MVC +某个RIA框架+...阅读全文
posted @ 2014-11-09 04:30 何镇汐 阅读(5478) 评论(4) 编辑