知识卡片
工作单元把数据库读写协调从领域层剥离出来
内容
只要加载到内存的对象数量一多、又出现”边新建行边修改其他引用它的行”这种需要先拿到新建行主键才能继续的情况,”每个对象自带加载/保存方法”(活动记录的显而易见做法)就会迅速变得难以管理——必须有人负责跟踪哪些对象被改过、按什么顺序把它们写回数据库。工作单元正是专门解决这个问题的模式:它跟踪所有从数据库读取的对象以及所有被修改过的对象,负责把更新按正确顺序提交到数据库,应用程序开发者只需要把工作”交托”给工作单元,而不是直接调用明确的保存方法。可以把工作单元理解成一个专职扮演”数据库映射控制器”角色的对象——如果不设工作单元,这个协调数据库读写时机的职责通常会落到领域层头上,工作单元的意义正是把这部分职责从领域层里剥离出来,单独封装进一个对象。可迁移启发:当发现某个协调性职责(”谁该在什么时候把什么状态同步到哪里”)散落在业务对象各处、导致每个对象都要操心这件与自身核心逻辑无关的事情时,值得考虑把这个协调职责单独抽成一个对象,而不是任由业务对象继续承担这份额外负担。
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第3章 映射到关系数据库"之"3.2 行为问题"(源文件:_epub-src/OEBPS/Text/000018.html)
- 结论依据:原文说明"有一种专门解决上述问题的模式就是工作单元。工作单元会跟踪所有从数据库中读取的对象以及所有以任何形式修改过的对象。它同样负责将更新提交到数据库……可以这样理解工作单元,它是一个对象,充当数据库映射的控制器。在没有工作单元的情况下,一般都是由领域层充当控制器",直接支撑本卡结论。
- 原始内容:应用程序的编程人员将工作交托给工作单元,而不是直接调用明确的保存方法。工作单元排列好对数据库的操作顺序,把所有复杂的提交处理放在一起。当与数据库的交互动作比较复杂的时候,工作单元是一个必要的模式。