博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Short DDD-1

Posted on 2011-12-27 10:25  theok  阅读(196)  评论(0)    收藏  举报

Summary

DDD-core-pic

 

  • Model Driven Design express model with Services
  • Model Driven Design express model with Entities
  • Model Driven Design express model with Value Objects
  • Model Driven Design isolate domain with Layered Architecture

 

  • Entities access with Repositories
  • Aggregates access with Respositories

 

  • Entities maintain integrity with Aggregates
  • Entities act as root of Aggregates
  • Value Objects encapsulate with Aggregates

 

  • Entities encapsulate with Factories
  • Value Objects encapsulate with Factories
  • Aggregates encapsulate with Factories

 

Layered Architecture

DDD-Layered-Archtecture

 

Pattern

管理领域对象的生命周期自身就会遇到一个挑战,如果做得不恰
当,就会对领域模型产生一个负面的影响。我们将引入3 个模式来
帮助我们处理这个挑战。聚合是一个用来定义对象所有权和边界的
领域模式。工厂和资源库是另外的两个设计模式,用来帮助我们处
理对象的创建和存储问题

Aggregates

聚合是如何保持数据一致性和强化不变量的呢?

聚合是针对数据变化可以考虑成一个单元的一组
相关的对象。聚合使用边界将内部和外部的对象划分开来。每个聚
合有一个根。这个根是一个实体,并且它是外部可以访问的唯一的
对象。根可以保持对任意聚合对象的引用,并且其他的对象可以持
有任意其他的对象,但一个外部对象只能持有根对象的引用。如果
边界内有其他的实体,那些实体的标识符是本地化的,只在聚合内
有意义。

根是外部对象的唯一可访问的对象,也是聚合存在与否的标志。根灭

了,聚合内的其他value objs都得灭了。

根对象可能将内部的临时引用传递给外部对象,作为限制,当操作
完成后,外部对象不能再持有这个引用。一个简单的实现方式是向
外部对象传递一个值对象的拷贝。在这个对象上发生了什么将不再
重要,因为它不会以任何方式影响到聚合的一致性。
如果聚合对象被保存到数据库中,只有根可以通过查询来获得。其
他的对象只能通过导航关联来获得。
聚合内的对象可以被允许持有对其他聚合的根的引用。
根实体拥有全局的标识符,并且有责任管理不变量。内部的实体拥
有内部的标识符。

一个简单的聚合的案例如下图所示。客户是聚合的根,并且其他所
有的对象都是内部的。如果需要地址,一个它的拷贝将被传递到外
部对象。

 

DDD-aggregates

 

Factory

将创建过程原子化非常重要。如果不这样做,创建过程就会存在对
某个对象执行了一半操作的机会,将这些对象置于未定义的状态,
对聚合而言更是如此。当根被创建时,所有对象服从的不变量也必
须被创建完毕,否则,不变量将不能得到保证。对不变的值对象而
言则意味着所有的对象被初始化成有效的状态。如果一个对象不能
被正常创建,将会产生一个异常,确保没有返回一个无效值。
因此,转变创建复杂对象和聚合的实例的职责给一个单独的对象,
虽然这个对象本身在领域模型中没有职责,但它仍是领域设计的一
部分。提供一个封装了所有复杂组装的接口,客户程序将不再需要
引用要初始化的对象的具体的类。将整个聚合当作一个单元来创
建,强化它们的不变量。

即Transection

 

资源库


使用一个资源库,它的目的是封装所有获取对象引用所需的
逻辑。领域对象不需处理基础设施,以得到领域中对其他对象的所
需的引用。只需从资源库中获取它们,于是模型重获它应有的清晰
和焦点。

资源库会保存对某些对象的引用。当一个对象被创建出来时,它可
以被保存到资源库中,然后以后使用时可从资源库中检索到。如果
客户程序从资源库中请求一个对象,而资源库中并没有它,就会从
存储介质中获取它。换种说法是,资源库作为一个全局的可访问对
象的存储点而存在。
资源库可能包含一定的策略。它可能基于一个特定的策略来访问某
个或者另一个持久化存储介质。它可能会对不同类型的对象使用不
同的存储位置。最终结果是领域模型同需要保存的对象和它们的引
用中解耦,可以访问潜在的持久化基础设施。

DDD-Repository

例子

DDD-Repository-Sample

另一个例子,利用规约(specification)指定一个查询条件

DDD-Repository-Sample2

流程

另外要注意的是工厂是“纯的领域”,而资源库会包含对基础设施
的连接,如数据库。

DDD-Flow