DDD(Domain-Driven Design 领域驱动设计)是由Eric Evans最早提出,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引发的软件复杂性的问题。整个过程大概是这样的,开发团队和领域专家一块儿经过 通用语言(Ubiquitous Language)去理解和消化领域知识,从领域知识中提取和划分为一个一个的子领域(核心子域,通用子域,支撑子域),并在子领域上创建模型,再重复以上步骤,这样周而复始,构建出一套符合当前领域的模型。bash
DDD中将系统分为UI层,应用层,领域层以及基础设施层。微信
上层模块不该该依赖于下层模块,二者都应该依赖于抽象;
抽象不该该依赖于实现,实现应该依赖于抽象;
复制代码
在使用DDD设计系统时,主要包括Entity,Value Object,Service,Aggregate,Repository,Factory,Domain Event,Moudle等元素架构
在建模时,Entity能够用来表明一个事物。既然Entity是用来表明一个事物的,那么它就应该有一个惟一值来标识这个事物,同时,他还能记录这个事物状态的变化。好比:Id为5的Person对象,它的名字是张三,过两天,他将本身的名字改成李四。可是,这我的(Id=5)仍是这我的(Id=5),只是他名字的状态以及发生了变化,而这个变化后的状态被Person这个Entity记录了下来。 Value Object是用来描述事物的某一方面的特征,因此它是一个无状态的,且是一个没有标识符的对象,这是和Entity的本质区别。拿订单来讲,一张订单在系统中应该有一个惟一的标识,且具备状态,因此订单是一个Entity对象,而这张订单共¥100元,则是描述了这个订单的总额特征,¥100元能够用值对象表示为{100,¥},及金额和币种的组合。{100,¥}在任何限界上下文中都描述的是¥100元,是由于他们比较的是里面的内容(金额和币种),而上面的张三在修了名后,仍是原来的那我的,是由于它比较的是惟一标示ID的值。 Aggregate是一组相关对象的集合,它做为数据修改的基本单元,为数据修改提供了一个边界。每一个聚合都有一个根和一个边界,根也是一个实体,聚合边界之外的对象只能经过根对聚合内部元素操做。聚合将一组相关的对象内聚到一块儿,从而将系统的复杂程度下降。 repository用来存储聚合,至关于每个聚合都应该有一个仓库实例。Entity和Value Object都应该具备行为,而有些行为从语义上讲,不适合放到这两个对象中,因此就单独抽象了一个Service对象,用来存放这些行为。Factory是用来生成聚合的,当生成一个聚合的步骤过于复杂时,能够将其生成过程放在工厂中。工具