DDD的基本概念

领域模型:是对具有某个领域边界的抽象。只反映业务,和任何技术实现无关;其不仅能反映领域中的一些实体概念,如货物,书本,应聘记录,地址,等;还能反映领域中的一些过程概念,如资金转账,等;建立正确的领域模型并不简单,需要领域专家、设计、开发人员积极沟通共同努力。

 

实体:根据eric evans的定义,”一个由它的标识定义的对象叫做实体”。通常实体具备唯一id(状态可以变化,但标识总是相同),能够被持久化,具有业务逻辑,对应现实世界业务对象。

    存在现象:将实体当成了orm意义上的实体,而不是业务定义的领域对象;现实时用了transaction script风格的架构,使用贫血的领域模型(无业务逻辑)。

 

值对象:描述事物的对象。通常值对象不具有唯一id,由对象的属性描述,可以用来传递参数或对实体进行补充描述。

    和实体的区别

      有两个对象,如果唯一标识不一样,那么即便实体的其他所有属性都一样,也认为是两个不同的实体;那么设计为实体对象

      两个对象的所有的属性的值都相同,我们会认为它们是同一个对象的话,那么设计为值对象;

      如果还区分不了,就设计为值对象。

 

聚合和聚合根(factories):聚合定义了一组具有内聚关系的相关对象的集合,我们把聚合看作是一个修改数据的单元。每个聚合都有一个根对象(聚合根实体),从外部访问只能通过这个对象。根实体对象有组成聚合所有对象的引用。如果根实体被删除,聚合内部的其它对象也将被删除。我们把聚合组织到一个文件夹或一个包中。

    注意:1、聚合中的对象关系是内聚的,集数据变化时必须保持不变的一致性规则。

      2、根的选择,如果有多个实体时,可以思考聚合内哪个对象有独立存在的意义并且可以和外部直接进行交互

 

工厂:用来封装创建一个复杂对象,尤其是聚合时所需的。一般用来初始化。

 

仓储(repositories:用来管理实体的聚合,和工厂的区别是,主要用来做持久化或者从基础层序列化聚合。

    respositories和dao的区别:

      dao是面向数据访问的,是关系型数据库和应用之间的契约;方法是细粒度的,更接近数据库。

      repository位于领域层;方法的粒度粗一些,而且更接近领域。领域对象应该只依赖于repository接口。

 

领域服务(services):设计实现领域服务来协调业务逻辑,只在领域服务中实现领域逻辑的调用。

    领域服务与domain对象的区别:

      一般的领域对象都是有状态和行为的,而领域服务没有状态只有行为协调领域对象共同完成某个操作,所有的状态还是都保存在相应的领域对象中;

      如果有些操作无法确定放在哪个领域对象中,或者操作跨多个领域对象,那么就将这种操作放在领域服务中;

 

posted @ 2022-03-09 18:09  修心而结网  阅读(266)  评论(0编辑  收藏  举报