近日,一种全新的 .Net 整洁架构(Clean Architecture)实现方案在开发者社区引发热议。该方案大胆提出:完全移除领域层(Domain Layer)和领域实体(Domain Entities),仅保留应用层、基础设施层和表示层。这一“瘦身”做法挑战了整洁架构的核心理念,被称为“无领域层的整洁架构”。部分开发者视其为简化复杂度的破局之道,而另一些则质疑其是否背离了整洁架构的初衷。
背景:整洁架构的“瘦身”冲动
整洁架构由 Robert C. Martin(鲍勃大叔)提出,其核心是依赖反转原则——业务规则应独立于框架、UI、数据库等外部因素。传统整洁架构通常包含四个层:领域层(存放实体、值对象、领域服务)、应用层(用例)、基础设施层(数据库、消息队列等)和表示层(API/UI)。其中领域层被视作“心脏”,封装了最核心的业务逻辑。
然而,许多 .Net 开发者在实践中发现,对于业务逻辑简单、以 CRUD(增删改查)为主的应用,领域层往往沦为“贫血模型”——仅包含数据属性和属性验证,缺乏真正的领域行为。这种“伪领域层”不仅增加了代码量,还造成了不必要的抽象层级。面对这一现实,部分开发者开始探索“去掉领域层”的可能性。
新方案:应用层直接接管业务逻辑
根据多位博主和社区贡献者发布的方案,无领域层的整洁架构主要做了以下调整:
- 移除全部领域实体和值对象。不再为业务概念创建专门的类,而是使用简单的 DTO(数据传输对象)或记录(record)代替。
- 将业务逻辑提升至应用层。原本由领域服务实现的规则、计算、验证等,被直接写入应用服务或用例(Use Cases)中。
- 基础设施层仍保持独立。仓储接口(Repository)可能被保留,但实现直接从应用层调用 ORM 或数据库服务。
- 依赖注入仍遵循依赖反转。应用层依赖抽象接口,基础设施层实现这些接口,表示层通过 DI 容器组装。
一位最早提出该方案的 .Net 开发者“CleanCodeEnthusiast”在博客中写道:“如果你的应用程序只是对数据库进行简单的增删改查,没有复杂的状态转换或业务不变式(invariants),那么领域层就是多余的成本。去掉它,你的代码会变得更易于理解、测试和修改。”
争议:这是否还算是“整洁架构”?
反对者的声音同样响亮。微软 MVP、整洁架构倡导者“Jane Doe”在技术社区发帖指出:“领域层是整洁架构的必要组成部分。如果没有领域层,所谓的‘核心业务逻辑’就会散落在应用服务中,与框架代码纠缠。这实际上退化成了传统的三层架构(UI、业务逻辑、数据访问)。它可能仍然是干净的,但绝不是整洁架构。”
另一位资深架构师“John Smith”补充道:“领域实体的价值在于强制规范化业务概念,确保所有代码遵循统一的数据模型。去掉它,你可能会获得短期开发速度,但长期维护中,业务规则的分散会导致高昂的认知负载。”
行业反应:并非全盘否定
值得注意的是,许多从业者并未完全否定无领域层的尝试。在 Stack Overflow、GitHub Discussion 等平台上,部分开发者表示“根据项目实际情况灵活选择架构”是合理的。一位拥有十年经验的 .Net 架构师指出:“整洁架构是一种原则而非教条。对于微服务中的简单命令查询职责分离(CQRS)场景,或者快速原型项目,使用无领域层的变体完全可行。关键是要理解取舍。”
也有开发者提议“折中方案”:保留领域层,但只放置真正的、具有行为逻辑的实体,将纯粹的 CRUD 数据类直接降级到应用层。这样的“轻量级领域层”既避免了冗余,又保留了核心理念。
结语:架构无绝对,适者生存
无领域层的 .Net 整洁架构解决方案,本质上是对鲍勃大叔原教旨主义的一种实用主义修正。它在简化代码、降低认知负荷方面确有优势,但也牺牲了业务建模的严谨性和架构的可扩展性。对于开发者而言,重要的是理解每个架构层存在的理由:领域层是为保护业务规则而生,而非为存在而存在。
未来,这一方案会否成为主流,取决于 .Net 社区能否形成统一的最佳实践。但正如一位评论者所言:“好的架构是‘恰好足够’的架构——恰好在复杂度与你预期的增长之间找到平衡点。”对于每位开发者,在工具与原则之间做出明智的选择,或许比盲目跟从任何一种模式更为重要。