Clean架构的文件夹、模块和包结构举例


简洁Clean架构是构建应用程序的一种流行方法。

这是一个分层架构,将项目分为四个层次:

  1. Domain
  2. Application
  3. Infrastructure
  4. Presentation

每一层通常都是解决方案中的一个项目。
这是清洁clean架构的视觉表示:

1、领域层Domain
领域层位于清洁架构的核心。在这里,我们定义了诸如:实体、值对象、聚合、领域事件、异常、存储库接口等。

这是我喜欢使用的文件夹结构:

 Domain
|__ DomainEvents
|__ Entities
|__ Exceptions
|__ Repositories
|__ Shared
|__ ValueObjects

需要注意的一件事是,领域层不允许引用解决方案中的其他项目。

这是一种“按类型分组”的方法来构造域。

优点:

  • - 易于使用
  • - 很容易知道“什么在哪里”

缺点:

  • - 无领域上下文
  • - 复杂性随着项目的增长而增加

Clean Architecture在文件夹结构方面非常灵活。 在较小的项目中使用过“按类型分组”的方法。

但是,如果项目增长,维护它很快就会变得棘手。 所以小心行事。

2、应用层
应用程序层位于域层的正上方。它充当域层的协调器,包含应用程序中最重要的用例。

您可以使用服务或使用命令和查询来构建用例。

我是CQRS模式的忠实粉丝,因此我喜欢使用命令和查询方法。

这是我喜欢使用的文件夹结构:

 Application
|__ Abstractions
    |__ Data
    |__ Email
    |__ Messaging
|__ Behaviors
|__ Contracts
|__ Entity1
    |__ Commands
    |__ Events
    |__ Queries
|__ Entity2
    |__ Commands
    |__ Events
    |__ Queries


在该文件夹中,我定义了Application层Abstractions所需的接口。这些接口的实现位于上层之一。
对于域层中的每个实体,我创建一个包含命令、查询和事件定义的文件夹。

3、基础设施层
基础设施层包含面向外部的服务的实现。

什么会属于这一类?

  • 数据库 - PostgreSQL、MongoDB
  • 身份提供商 - Auth0、Keycloak
  • 电子邮件提供商
  • 存储服务 - AWS S3、Azure Blob 存储
  • 消息队列 - Rabbit MQ

这是我喜欢使用的文件夹结构:

 Infrastructure
|__ BackgroundJobs
|__ Services
    |__ Email
    |__ Messaging
|__ Persistence
    |__ EntityConfigurations
    |__ Migrations
    |__ Repositories
    |__ #️⃣ ApplicationDbContext.cs
|__ ...

将 Persistence 文件夹作为其项目并不罕见。我经常这样做,以便将所有面向数据库的代码包含在一个项目中。

4、表示层
表示层是我们系统的入口点。通常,您可以将其实现为 Web API 项目。
表示层最重要的部分是Controllers,它定义了我们系统中的 API 端点。
这是我喜欢使用的文件夹结构:

 Presentation
|__ Controllers
|__ Middlewares
|__ ViewModels
|__ ...
|__ #️⃣ Program.cs

有时,我会将表示层从实际的 Web API 项目中移走。我这样做是为了隔离Controllers并执行更严格的约束。