名词与概念
- DDD
Domain Driven Design即领域驱动设计
- CQRS
Command Query Responsibility Seperation(命令查询职责分离)的缩写把查询数据 同程为 Query (查询), 只提供根据聚合的ID 进行查询,查询结果 以DTO 形式返回改变状态叫做 Command (命令) , 提供Create,Update ,Delete 操作
- 实体(Entity)
许多对象不是由它们的属性来定义,而是通过一系列的连续性(continuity)和标识(identity)来从根本上定义的。只要一个对象在生命周期中能够保持连续性,并且独立于它的属性(即使这些属性对系统用户非常重要),那它就是一个实体。
- 值对象(Value Object)
当你只关心某个对象的属性时,该对象便可作为一个值对象。为其添加有意义的属性,并赋予它相应的行为。我们需要将值对象看成不变对象,不要给它任何身份标识,还应该尽量避免像实体对象一样的复杂性
- DTO
Data Transfer Object,数据传输对象。与外部系统比如前端、其他应用服务进行交互传输的对象
- DO
Data Object,数据对象。从DB、外围应用服务等反序列化获取到并转换为本应用服务对象称之为DO
- 序列化与反序列化(Serialize Deserialize)
将外围系统数据转为为本应用服务DO的过程称之为序列化,如:将外部Dubbo接口返回的DTO转为本应用服务的DO对象的过程。与之相反的过程称之为反序列化。
- 组装(Assemble)
用户接口层(前端)以及其他应用服务查询本应用服务的数据时,往往需要将各种DO组装成其所需要的DTO,这个过程称之为组装
- 聚合(Aggregate)
一组紧密相关的实体共同组成一个聚合的对象
- 聚合根(Aggregate Root)
聚合对象中唯一一个实体的唯一标识可以整个聚合对象的唯一标识,该实体则为聚合的根,简称聚合根。比如一个订单聚合对象,包含基本订单实体、订单关联用户实体、订单关联商品实体,用订单编码作为唯一标识,则基本订单实体为改聚合对象的聚合根
- 资源库(Repository)
领域模型中的对象自从被创建出来后不会一直留在内存中活动的,当它不活动时会被持久化到数据库中,然后当需要的时候我们会重建该对象;重建对象就是根据数据库中已存储的对象的状态重新创建对象的过程;所以,可见重建对象是一个和数据库打交道的过程。从更广义的角度来理解,我们经常会像集合一样从某个类似集合的地方根据某个条件获取一个或一些对象,往集合中添加对象或移除对象。也就是说,我们需要提供一种机制,可以提供类似集合的接口来帮助我们管理对象
- 领域服务(Domain Service)
领域中的一些概念不太适合建模为对象,即归类到实体对象或值对象,因为它们本质上就是一些操作,一些动作,而不是事物。这些操作或动作往往会涉及到多个领域对象,并且需要协调这些领域对象共同完成这个操作或动作。如果强行将这些操作职责分配给任何一个对象,则被分配的对象就是承担一些不该承担的职责,从而会导致对象的职责不明确很混乱。但是基于类的面向对象语言规定任何属性或行为都必须放在对象里面。所以我们需要寻找一种新的模式来表示这种跨多个对象的操作,DDD认为服务是一个很自然的范式用来对应这种跨多个对象的操作,所以就有了领域服务这个模式。和领域对象不同,领域服务是以动词开头来命名的,比如资金转帐服务可以命名为MoneyTransferService。
- 领域事件(Domain Event)
一个领域事件可以理解为是发生在一个特定领域中的事件,是你希望在同一个领域中其他部分知道并产生后续动作的事件。但是并不是所有发生过的事情都可以成为领域事件。一个领域事件必须对业务有价值,有助于形成完整的业务闭环,也即一个领域事件将导致进一步的业务操作。
领域事件可以是业务流程的一个步骤,例如订单提交,客户付费100元,订单完工等。领域事件也可以是定时发生的事情,例如每晚对账完成。或者是一个事件发生后引发的后续动作,例如客户输错密码三次后发生锁定账户的事件。