1. 为何两个上下文间不应直接共享数据库(应为防腐层)
请解释为何两个界限上下文(Bounded Context)间不应直接共享数据库,而应通过防腐层(Anti-Corruption Layer)交互?
- 界限上下文(BC)的自治与边界
- 共享数据库的耦合与模型侵扰
- 防腐层(ACL)的作用
- 界限上下文:DDD 中每个上下文有独立的领域模型与通用语言,边界是自治的。直接共享数据库会破坏这种自治。
- 为什么不直接共享数据库:① 两个上下文的模型不同(可能同名不同义),共享表会让一个上下文的模型耦合到另一个的 schema,导致模型被侵扰、无法独立演化;② 共享库导致强耦合,一个上下文的表结构变更影响另一个;③ 违背"上下文边界",使边界形同虚设。
- 防腐层(ACL):用 ACL 隔离——一个上下文需要另一个上下文的数据时,通过 ACL 转换(把对方的模型/语义转换成自己的模型),不直接访问对方数据库。ACL 是适配器,负责翻译、隔离、防止对方模型污染自身。
- 正确做法:每个上下文拥有自己的数据库/模式,跨上下文交互通过接口/事件/ACL,不直接共享库。
共享数据库会让两个上下文模型耦合、无法独立演化,破坏边界自治。防腐层(ACL)转换模型、隔离边界,是跨上下文交互的正确方式。