06 | 跨越现实的障碍(下):架构分层就对了吗?
徐昊
该思维导图由 AI 生成,仅供参考
你好,我是徐昊。今天我们来聊聊如何有效地基于领域模型构造合理的架构。
到目前为止,我们学会了通过关联对象解决聚合 / 关联关系;利用角色对象分离不同上下文中的交互;并使用上下文对象完成实体对象到角色对象的扮演。这些模式通过结构上的优化,更好地组织了对核心数据的访问逻辑,使得我们可以在兼顾架构约束的同时,将领域概念与逻辑有效地转化为领域模型。
然而当我们把眼光从构造领域模型,扩展到利用领域模型构建整个应用或系统时,就会遇到新的问题:如何组织领域逻辑与非领域逻辑,才能避免非领域逻辑对模型的污染?
通常我们会使用分层架构(Layered Architecture)区分不同的逻辑以解决这个问题。然而由于领域层被人为赋予了最稳定的特性,破坏了分层架构间的依赖关系。所以我们需要修正分层,才能有效地围绕领域模型来构造软件架构。
那么今天这节课我们就看看分层架构的问题在哪儿,以及如何通过能力供应商(Capability Provider)模式获得一个更好的架构愿景。
领域层的“不正当关系”
分层架构是运用最为广泛的架构模式,它将不同关注点的逻辑封装到不同的层中,以便扩展维护,同时也能有效地控制变化的传播。
在使用领域驱动设计时,我们通常会将系统分成四层:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了领域驱动设计中的架构分层问题,并提出了通过能力供应商模式来解决领域层稳定性与基础设施层变化性之间的矛盾。作者指出基础设施并不是层,而是一种能力供应商,通过将具有业务含义的能力抽象成接口纳入领域层,实现了领域模型与软件实现的关联。这种模式使得领域层既能使用基础设施,又不暴露对其的依赖,从而确立了领域层的核心位置。文章深入浅出地解释了分层架构中的问题,并提出了解决方案,对于理解领域驱动设计中架构分层的读者具有一定的参考价值。文章还提到了能力供应商模式是一个元模式,关联对象、角色对象和上下文对象可以看作它的具体应用。熟练掌握这个模式,读者就可以根据需要发明自己的领域驱动实现模式。文章最后提出了一个思考题,探讨了能力供应商模式对项目交付的挑战以及需要怎样的知识管理手段才能保证知识传递的顺畅。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《如何落地业务建模》,新⼈⾸单¥68
《如何落地业务建模》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(37)
- 最新
- 精选
- 码农戏码置顶理论指导实践,实践反哺理论,有时实践对了但归纳不出理论,有时有了理论却落不了地,统称摸着石头过河,这是低手所为,高手总是深刻理解理论,升华理论,实践手到擒来,行云流水 使用maven构建项目时,根据DDD拆分成四个module并如此依赖:controller -> application -> domain -> infrastructure 但存在一个循环依赖问题:ddd中规定repository是domain,所以接口在domain层,但现实在infra层,那infra得依赖domain了,可从maven module依赖讲,domain是依赖infra的,只能先把repository接口放到infra中 可domain才是核心,最稳定的,不能被技术束缚,倒置一下,但技术并不只有db,还有IO,消息等等总不能像repository一样,把这些接口都放到domain,那domain很不纯粹 聪明的我又想到用namespace解决,从maven module讲,这些都放在domain层,但不再放在com.zhuxingsheng.domain包下,而放到对应的包下,如message放在com.zhuxingsheng.message,这样保证了domain的稳定,落地也不太别扭 这样好不好,不知道,至少说服我自己了 相比老师的能力供应商模式,差了好几个层次,第一只关注技术,没有对接口提取出领域概念,以领域知识为核心,第二虽然觉两层关系有丝丝别扭,但不敢质疑,并大声说出他们关系的不正当
作者回复: namespace并不是跟domain 层一一对应 所以概念上 依赖还是解开
2021-07-262 - Jxin置顶1.能力供应商/防腐层,其实都是一个东西。为逻辑功能的组成部分定义清晰的业务模型 + 领域层只包含自身定义的业务模型(接口/类) + 为这些业务模型定义寻找实现。隔离变化,不管是不同变化频率还是不同变化方向。 2.双向依赖大部分时候,可能是领域模型有所欠缺。识别定义抽取新的领域模型来公用会比实现双向依赖要好些,哪怕双向是隐式的,如果时间允许的话。 课后题,太晚了,脑子思绪混乱,等周末再琢磨。
作者回复: 并不是防腐层 不要用解决方案去定义问题。而是问题定义解决方案。同解决方案不同问题 就是不同的模式,比如proxy decoration middleman 解决方案都是一个类代理给另一个类 然而它们并不是一个东西
2021-07-07422 - 威为什么说支付失败的回访是应用层逻辑,而不是领域层逻辑呢,这里的划分是有什么准则吗
作者回复: 变化速率
2021-07-068 - 冯思考题,根据前面说的两关联一循环。这里把技术概念转换成了领域概念,然后反映到统一语言上。这就需要团队不断的执行循环,才能把知识消掉。业务方和技术方也需要紧密的配合和互相信任。
作者回复: good
2021-07-0633 - shen看到这章对老师膜拜了。看过不少DDD的内容,实际很难落地,老师结合软件设计相关内容从更高的纬度指导落地,这正是我想要的。
编辑回复: yyds
2021-07-262 - 陈凯杰用拟人化去命名这个很妙!另外文章中的例子,实际设计中应该会丟一个消息中间件作为解耦。例如业务要发消息,发邮件,这样是不是就减少对基础设施的依赖?
作者回复: 消息中间件是服务接口的一种实现形式
2021-07-162 - 黄大仙文中能力供应商的实现方式是方法中传入,想必应该是在能接触到能力供应商的实例的最初始的调用者上传入的,比如领域服务。那么问题来了,在较为复杂的调用链中,这种传来传去很奇怪,该如何优化及避免?
作者回复: 奇怪在哪
2021-10-1121 - Z.G老师你好,为什么失败回访是应用层的逻辑而不是领域层的逻辑呢?如何区别?比如业务需要记录一下回访的次数是不是就变成领域逻辑了?
作者回复: 往后看
2021-09-101 - 爱睡觉“不正当关系”😂。写的太好玩了
作者回复: 话糙理不糙
2021-07-161 - 箭和方糖DDD本身有所谓的成熟度模型吗?比如总共有5档,有些项目可以做到5,有些项目受限于某些因素只能做到2或者3。这样的成熟度模型是否有意义
作者回复: 无意义
2021-07-061
收起评论