领域驱动设计概念介绍

实体(Entity) 具有惟一标识的领域对象。通过标识来区分不同的实体。实体具有惟一性。 注:领域就是特定的问题域 如 订单领域 商品领域,是描述事物的一个模

实体(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)

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

领域层

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