知识卡片

严格分层下的服务逐层封装机制

普通读书笔记卡

内容

在严格分层架构下,服务不允许跨层调用,每个服务只能调用紧邻的下一层服务,调用链条从下到上依次是实体方法→领域服务→应用服务→facade接口。这条约束天然带来一个问题:一个实体方法本身只是最底层的原子业务逻辑,如果这个方法需要被应用层甚至用户接口层调用,该怎么办?书中给出的解法是逐层封装:如果实体方法需要被应用服务调用,先把它封装进一个领域服务,领域服务就能被应用服务组合编排;如果这个能力还需要被用户接口层(进而是前端应用)调用,就再把领域服务封装进一个应用服务,应用服务经过用户接口层的facade封装后发布到API网关。书中举了一个具体例子:个人客户聚合根创建客户信息的方法,先被封装成”创建个人客户信息”领域服务,再封装成”创建个人客户信息”应用服务,最后封装成facade接口暴露给前端——同一个能力,随着它需要被暴露的层次越来越高,就要多穿一层”封装外衣”。这个机制说明严格分层的代价是要接受这种逐层包装带来的额外样板代码,但换来的收益是任何一层的实现细节变化,都只会影响到直接包装它的那一层,不会像跨层直接调用那样让改动扩散到很远的地方。

参考来源

- 位置:《中台架构与实现:基于DDD和微服务》第15章《如何保证领域模型与代码模型一致》"15.2.2 应用层的领域对象"(源文件:_epub-src/OEBPS/Text/chapter4-4-2-2.xhtml) - 结论依据:原文说明"在严格分层架构模式下,不允许服务的跨层调用,每个服务只能调用它紧邻的下一层服务。服务从下到上依次为:实体方法、领域服务、应用服务和facade接口……如果需要实现服务的跨层调用……建议采用服务逐层封装的方式",并以个人客户聚合根创建方法逐层封装为例说明,直接支撑本卡片结论。 - 原始内容:在严格分层架构模式下,不允许服务的跨层调用,每个服务只能调用它紧邻的下一层服务。服务从下到上依次为:实体方法、领域服务、应用服务和facade接口……个人客户聚合根创建个人客户信息的方法,会被封装为创建个人客户信息领域服务,然后再被封装为创建个人客户信息应用服务,最后会被封装成facade接口发布到API网关。