zoukankan      html  css  js  c++  java
  • 领域驱动设计概念介绍

    实体(Entity)

    具有惟一标识的领域对象。通过标识来区分不同的实体。实体具有惟一性。

    注:领域就是特定的问题域 如 订单领域 商品领域,是描述事物的一个模型

    值对象(Value Object)

    和实体不同,值对象没有标识。不需要跟踪值对象的标识和值对象状态的维护,值对象非常容易创建和丢弃。大多数的时候,值对象只包含数据,不包含行为。值对象最好是不可变的,也就是说,值对象用一个构造函数创建,所有的属性都是只读的,不需要维护值对象的状态。不可变的值对象是可以共享的。

    区分实体和值对象的准则:关心对象的标识,对象是惟一的,则为实体。

    聚合(Aggregate)

    通过定义对象之间的清晰的所属关系和边界来实现领域模型的内聚。并避免了错综复杂的难以维护的对象关系网的形成。聚合定义了一组具有内聚关系的相关集合,我们把聚合看作是一个工作单元

    聚合的特点:

    1、每个聚合有一个根(聚合根)和一个边界,边界定义了一个聚合内部有哪些实体或值对象,根是聚合内部的一个实体。

    2、 聚合根可以引用其他聚合根,通常通过ID(标识)关联,聚合内的对象之间可以相互引用。聚合根是外部访问聚合内部对象的媒介,换句话说,聚合外部如果访问聚合内部的对象时,必须通过聚合根开始导航,不允许直接访问聚合内部的对象。

    3、聚合根的标识是整个聚合的标识。

    4、聚合是一个单元,我们从数据库或者其他存储中重建聚合(读取对应领域中的重建, new 对应领域中的创建),也是读取整个聚合,而不能直接查询聚合内部的某个非根的对象。删除一个聚合根时,必须同时删除该聚合中的所有相关的对象。聚合是一个完整的整体,不可分割。

    聚合根(Aggregate root)

    聚合中的一个实体。

    区别聚合根:

    1、有独立存在的意义,即它是不依赖于其他对象的存在它才有意义。

    2、可以被独立访问,还是必须通过某个对象导航得到的。

    服务(Service)

    这里的服务不是我们与soa没有关系。有时在设计领域模型时,有某些行为不适合放到任何一个类中,我们通常会创建一个服务类,用来维护这些行为。服务类没有内部状态,可以简单地作为一个提供操作的接口实现,服务通常协调一个或多个领域对象工作。需要注意的是  服务可以放到应用层、领域层、基础服务层

    应用层服务(Application Service)

    应用层中的服务通常协调放到其他层中的服务工作,大多数情况下,应用层中的服务多数是流程性质的。

    领域层服务(Domain Service)

    处理领域内部的值对象 实体的交互。

    基础层服务()

    通常存放的是与业务无关的服务,如邮件通知服务。

    仓储(Repository)

    仓储的职责是将领域对象持久化到数据库或者其他的存储介质,或者当需要领域对象时从数据库中重建领域对象。仓储的下层是数据库,上层是服务。从更广义的角度来理解,我们经常会像集合一样从某个类似集合的地方(数据库)根据某个条件获取一个或一些对象。在这个集合中添加或移除对象。仓储就是提供了类似集合接口来帮助我们管理对象。或者更直白的说,仓储是数据库中的数据在内存中的表现。通常仓储包含2个部分,仓储的定义部分(接口)、仓储实现部分(接口的实现类),通常仓储的定义部分存放在领域模型中 ,实现部分存放在基础服务层。尽管仓储可以像集合一样在内存中管理对象,但是仓储不负责事物处理,一般的事物处理交由 工作单元(Unit Of work)

    工厂(Factory)

    简单的领域对象的创建可以通过构造函数来处理。工厂则是用来封装创建一个复杂对象尤其是聚合时所需的。

    领域层

    领域服务 实体 值对象 构成领域层

  • 相关阅读:
    还需要做恰当的解读,此时你可能需要一些书:
    创业公司的架构演进史
    任务调度平台Cuckoo-Schedule
    ORACLE中死锁
    Action的模型绑定
    三次握手、四次握手、backlog
    Django框架
    扩展BootstrapTable的treegrid功能
    Identity Service
    Linux权限
  • 原文地址:https://www.cnblogs.com/whx1973/p/3046319.html
Copyright © 2011-2022 走看看