软件生产与模型(三):领域对象的生命周期

软件生产与模型:分离领域以及软件生产与模型(二):模型描述(实体、值对象、服务) 探讨了分层对领域的意义以及如何表达领域模型,下面来看看领域对象的生命周期

 

 

在知道了突出领域以及表达领域之后,便要深入的了解一下领域的生命周期。处理领域对象的生命周期有两类挑战:

  l 在生命周期中维护对象的完整性

  l 避免模型由于管理生命周期的复杂性而陷入困境

 

 

   这可以使用3个模式来处理这些问题,首先是聚合(Aggregate),通过定义清晰的所有权和边界来使模型变得更紧凑,避免出现盘根错节的对象(关系)网。这个模式对维护模型的完整性非常关键。

   接下来,便是生命周期的开始部分,用工厂(Factory)来创建个重组复杂的对象和聚合,并保持对其内部结构的良好封装。最后,仓储(Repository)用于处理生命周期的中间和结束部分。

 

建立聚合的模型,并把工厂和仓储加入到设计中来,可以使我们系统的对模型对象进行操纵,同时使得这些对象的生命周期成为一个个意义明确的单元

 

 

 

聚合

 

对于一个人的删除,删除了这个人的名字、生日和职位描述信息等等,但是,是不是要删除地址呢?其他人可能也住在同一个地址。如果把地址也删很粗,那么其他Person对象将引用一个被删除了地址的对象。但是如果把地址流下来,会积累一些无用的地址的对象。看起来好像是一个技术上的问题,但是实际上来自于模型-------------模型中缺乏明确的边界

 

聚合边界内构成了一个小整体,里面有一个聚合根,比如,对于一辆车来说,有车轮。车胎,但是聚合根是车身。

 

为了将概念上的聚合转换成为实现,我们需要在所有的事物中应用一系列的规则:

 

 

  l 根实体具有全局标识,并最终负责对不变量的检查

  l 边界之内的ENTITY具有本地标识,这些标识仅在聚合内部是唯一的

  l 聚合边界以外的任何对象,除了可以引用根实体,不能持有任何对其内部对象的引用。跟实体可以把其内部实体的引用传递给其他对象,但是它们只是能临时引用,而不能持有这种引用

  l 能通过数据库查询直接获得的对象只有聚合根,所有其他对象必须通过导航关联来访问

  l 聚合内的对象可以持有其他聚合根的引用

  l 删除操作必须一次性删除聚合边界内的所有对象

  l 当在聚合边界内发生的任何对象修改被提交时,整个聚合的所有不变两必须都被满足

 

 

 

这样,由于控制了访问,因此我们无法绕过它去修改内部元素。这种安排使得可以保证在任何状态变化中,聚合本身(作为一个整体)的不变两,以及聚合中对象的不变量都可以被满足

 

 

工厂

 

聚合定义了一个事物的边界,那么创建一个对象或整个聚合的逻辑变得非常复杂,或者过多的暴露了内部结构时。工厂提供了封装。

 

比如轿车引擎是非常复杂的,只有在生产轿车时才需要组装的功能,所有组装一个复杂的复合对象的工作,与该对象被组装成功以后所执行的任何其他工作,最好分离开来。但是如果把组装的职责转移到其他对此感兴趣的对象,比如客户,那就会使问题变得更兼糟糕。

 

复杂对象创建工作属于一种领域层的职责,然而创建工作并不属于表达模型对象。对象的创建和组装在领域中通常没有含义,它们只是实现上的需要。为了解决这个情况,我们必须在另一种构造,它既不是实体也不是实体或是服务,这就是一个工厂,他不对应于模型中的任何事物,但是它确实要完成领域层的部分职责

 

 

 

工厂的应用场合

 

工厂的应用场合一般是围绕聚合来考虑的,每当我们希望隐藏一些信息(具体实现细节或复杂的构造逻辑)但是似乎由没有一个自然的地方可以容纳它们时,我们就应该创建一个专门的工厂对象。

(工厂好像和服务类似,都是为了解决领域层中一些不自然的地方而建立的,但是两者从意义上不同,工厂是专门为创建对象而创建的,而创建对象并没有业务意义,不属于服务)

 

 

仓储

 

领域驱动设计的一个目标就是通过聚焦领域模型(而不是技术)来生产更好的软件。

但是我们在构造一个SQL时,模型的焦点已经消失了。我们很自然的把对象想象为查询提供的数据的容器,而整个的设计就偏向数据处理的风格了,开发人员还是考虑技术机制,而不是领域。

 

我们需要一种技术来解决数据访问技术挑战,包括把SQL封装为查询对象(QUERY OBJECTS)或者通过元数据映射层实现对象和表示之间的转换。仓储模式提供一个简单的概念框架,用来把上面那些解决方案封装起来,并且找回模型的焦点

 

一个仓储将某种类型的所有对象描述为一个概念性的几何(通常是模拟几何),它的行为与集合类似,但它包含更兼精细的查询能力。

 

为每种需要全局访问的对象类型创建一个对象,该对象为该类型所有对象在内存中的集合提供影像。根据某种标准筛选对象的方法,返回完整实例化了的属性值,符合标准的对象或对象几何,把实际的存储和查询技术封装起来。仅为确实需要直接访问的聚合提供仓储。让客户聚焦于模型,把所有对象存储和访问的工作委托给仓储来完成

 

 

 

 

工厂与仓储

 

工厂处理的是对象生命周期的开始,仓储则是帮助管理生命周期的中间和结束部分。从技术上,可以认为仓储就是一种工厂,从领域驱动的设计视角中,工厂和仓储职责完全不同,工厂创建新的对象化,仓储寻找旧的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值