任何系统都需要处理错误,本文介绍的异常公共操作类,用于对业务上的错误进行简单支持。对于刚刚接触.Net的新手,碰到错误的时候,一般喜欢通过返回bool值的方式指示是否执行成功。public bool 方法名() {//执行代码,成功返...

在 应用程序框架实战十四:DDD分层架构之领域实体(基础篇) 一文中,我介绍了领域实体的基础,包括标识、相等性比较、输出实体状态等。本文将介绍领域实体的一个核心内容——验证,它是应用程序健壮性的基石。为了完成领域实体的...

前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持。本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分。如果说你已经在使用DDD分层架构,但你却从来没有使用过值对象,这毫不...

上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见。这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践。但是设计与实践的好与坏,对于不同的人,以...

前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题。我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚,并为你提供业务...

上一篇介绍了DDD聚合以及与并发相关的各种锁机制,本文将介绍另一个核心元素——工作单元,它是实现仓储的基础。什么是工作单元维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。这是《企业应用架构模式》中...

上一篇介绍了工作单元层超类型的封装演化过程,本文将介绍对Entity Framework映射层超类型的封装。使用Entity Framework一般需要映射三种类型的对象,即实体、聚合、值对象。聚合与实体映射的主要区别是:聚合映射单属性标识...

前面已经介绍过Entity Framework的工作单元和映射层超类型的封装,从本文开始,将逐步介绍仓储以及对查询的扩展支持。什么是仓储仓储表示聚合的集合。仓储所表现出来的集合外观,仅仅是一种模拟,除了测试以外,没有理由使用...

前一篇介绍了仓储的基本概念,并谈了我对仓储的一些认识,本文将实现仓储的基本功能。仓储代表聚合在内存中的集合,所以仓储的接口需要模拟得像一个集合。仓储中有很多操作都是可以通用的,可以把这部分操作抽取到基类中。在...

前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类。很多时候,我们会判断一个对象是否为null,由于null是一个不能接...

前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务。Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递。在Linq中,大量使用Lambda表达式进行查询,不过这种...

上面两篇已经作好准备,本文将进行基础查询扩展。当使用了Entity Framework这样的ORM框架以后,我们查询的核心被集中在IQueryable的Where方法上。如果UI需要通过姓名查询一个客户,会在UI上放置一个输入框作为客户姓名的查...

上一篇介绍了IQueryable的Where方法存在的问题,并扩展了一个名为Filter的过滤方法,它是Where方法的增强版。本篇将介绍查询的另一个重要主题——分页与排序。对于任何一个信息系统,查询都需要分页,因为不可能直接返回表中...

前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类。Lambda表达式公共操作类,我在前面已经简单介绍过,要么从Lambda...

上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展。修改Util项目的Extensions.Expression.cs文件,代码如下。using System; using System.Linq; using System.Linq.Expressions; ...

当你使用可空的值类型时,你会发现取值很不方便,比如Guid? obj,你要从obj中获取值,可以使用Value属性obj. Value,但obj可能为null,这时候就会抛出一个异常。可空值类型提供了一个HasValue属性,它可以识别出obj是不是一个...

本篇介绍的表达式生成器,用于动态创建表达式。在Util项目Lambdas目录中,添加ExpressionBuilder,代码如下。using System; using System.Linq.Expressions;namespace Util.Lambdas {/// <summary>/// 表达式生成器/// </...

前面已经做了一些准备工作,本篇将介绍查询条件的封装,它是规约模式的一个应用。规约使用一个对象来封装谓词,我之前已经介绍过它在验证方面的应用,本篇是规约模式在查询方面的应用。规约的强大之处在于,能够将一堆杂乱无...