一、设计核心原则
- Git 拆分友好:前后端、公共库物理隔离,可直接拆分为 3 个独立 Git 仓库
- 职责单一清晰:前后端彻底解耦,不交叉耦合业务/持久化代码
- 分层标准规范:遵循 DDD 领域驱动设计,兼容现有业务模块
- 可维护可扩展:支持多客户端、多服务端、插件化开发
二、根目录结构(总仓库)
1 2 3 4 5
| 项目根目录/ ├── .gitignore、README.md、.editorconfig # 全局配置文件 ├── Client/ # 【独立仓库】客户端(纯UI+接口调用) ├── Server/ # 【独立仓库】服务端(纯业务+数据持久化) └── Shared/ # 【独立仓库】公共库(前后端共享代码)
|
三、客户端模块(Client)- 纯前端展示层
1 2 3 4 5 6 7 8 9 10 11 12
| Client/ ├── src/ │ ├── Presentation/ # 表现层(UI核心) │ │ ├── Controls/ # 控件、样式库 │ │ ├── Modules/ # 业务模块(页面、本地逻辑) │ │ └── Addons/ # 客户端插件/扩展 │ ├── Services/ # 服务封装层 │ │ ├── Api/ # 远程接口调用 │ │ └── Local/ # 本地服务(缓存、文件) │ ├── Utils/ # 客户端专属工具 │ └── Assets/ # 静态资源 └── tests/ # 客户端测试
|
四、服务端模块(Server)- 纯业务数据层
1 2 3 4 5 6 7 8
| Server/ ├── src/ │ ├── Api/ # 接口层(对外提供服务) │ ├── Application/ # 应用层(业务编排) │ ├── Domain/ # 领域层(核心实体、业务规则) │ ├── Persistence/ # 数据持久层(数据库、仓储) │ └── Infrastructure/# 基础层(日志、缓存、通用组件) └── tests/ # 服务端测试
|
五、公共库模块(Shared)- 前后端通用层
1 2 3 4 5
| Shared/ ├── src/ │ ├── Shared.Core/ # 核心共享(DTO、枚举、常量、接口) │ └── Shared.Utils/ # 通用工具(加密、序列化、验证) └── tests/ # 公共库测试
|
六、单体应用结构
针对无需拆分前后端独立仓库的单体式应用场景,设计如下标准化目录结构,兼顾分层规范与开发便捷性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| 单体应用根目录/ ├── Solution Item/ # 解决方案级配置项 │ ├── .gitignore # Git忽略规则 │ ├── README.md # 项目说明文档 │ ├── .editorconfig # 编辑器格式统一配置 │ └── Solution.sln # 解决方案文件(如.NET) ├── Presentation Layer/ # 展示层(UI交互核心) │ ├── 1.1 Controls/ # 控件、样式库 │ │ ├── Common/ # 通用基础控件(按钮、表格、弹窗等) │ │ ├── Business/ # 业务专属控件(定制化表单、图表等) │ │ └── Styles/ # 样式文件(主题、布局、全局样式) │ ├── 1.2 Modules/ # 业务模块(按功能域划分) │ │ ├── User/ # 用户模块(登录、注册、个人中心) │ │ ├── Order/ # 订单模块(下单、支付、物流) │ │ └── Product/ # 商品模块(列表、详情、库存) │ └── 1.3 Addons/ # 插件扩展(非核心功能) │ ├── Print/ # 打印插件 │ ├── Export/ # 导出插件 │ └── Notification/ # 消息通知插件 ├── 2. Service Layer/ # 服务层(业务逻辑编排) │ ├── UserService/ # 用户相关服务 │ ├── OrderService/ # 订单相关服务 │ ├── ProductService/# 商品相关服务 │ └── ServiceBase/ # 服务基类(通用方法、异常处理) ├── 3. Persistence Layer/ # 数据层(数据存取) │ ├── Repositories/ # 仓储实现 │ │ ├── UserRepository.cs │ │ ├── OrderRepository.cs │ │ └── ProductRepository.cs │ ├── DataContext/ # 数据上下文(数据库连接、ORM配置) │ ├── Migrations/ # 数据迁移脚本(如EF Core迁移) │ └── SqlScripts/ # 原生SQL脚本(复杂查询、批量操作) ├── 4. Domain Layer/ # 领域层(核心业务规则) │ ├── Entities/ # 领域实体(User、Order、Product) │ ├── ValueObjects/ # 值对象(Address、Money、DateTimeRange) │ ├── Aggregates/ # 聚合根(OrderAggregate、UserAggregate) │ ├── DomainEvents/ # 领域事件(OrderCreatedEvent、UserUpdatedEvent) │ └── DomainServices/# 领域服务(跨实体业务规则) ├── 5. Infrastructure Layer/ # 基础设施层(通用能力支撑) │ ├── Logging/ # 日志组件(日志记录、存储、查询) │ ├── Caching/ # 缓存组件(Redis、MemoryCache) │ ├── Authentication/# 认证授权(Token、权限验证) │ ├── HttpClient/ # 第三方接口调用 │ └── Configuration/ # 配置管理(配置读取、动态更新) ├── 6. Tools/ # 工具层(通用工具类) │ ├── Encryption/ # 加密解密(MD5、RSA、AES) │ ├── Serialization/ # 序列化(JSON、XML、Protobuf) │ ├── Validation/ # 数据验证(参数校验、规则验证) │ └── Extensions/ # 扩展方法(字符串、集合、日期扩展) ├── 7. Examples/ # 示例代码(参考用例) │ ├── ApiExamples/ # 接口调用示例 │ ├── BusinessExamples/ # 业务场景示例 │ ├── IntegrationExamples/ # 第三方集成示例 │ └── UnitTestExamples/ # 单元测试示例 └── Tests/ # 测试目录 ├── UnitTests/ # 单元测试 ├── IntegrationTests/ # 集成测试 └── UiTests/ # UI测试
|
单体应用分层职责说明
Solution Item:统一存放解决方案级的配置文件,确保项目根目录整洁,配置文件全局复用;
Presentation Layer:仅负责UI展示、用户交互,不包含业务逻辑,通过调用服务层完成功能,其中:
Controls:封装可复用的UI控件和样式,降低页面开发重复度;
Modules:按业务功能域划分页面模块,边界清晰;
Addons:封装非核心的扩展功能,支持插件化启停;
Service Layer:承接展示层的调用请求,编排领域层能力完成业务逻辑,是展示层与领域层的中间层,解耦UI与核心业务;
Persistence Layer:仅负责数据的持久化和读取,不包含业务规则,通过仓储模式封装数据操作,适配不同数据源;
Domain Layer:核心业务规则层,包含实体、值对象、聚合根等领域模型,是整个应用的业务核心,不依赖其他层;
Infrastructure Layer:为各层提供通用技术能力,如日志、缓存、认证等,封装第三方组件,降低耦合;
Tools:提供全项目通用的工具类,无业务耦合,可独立复用;
Examples:提供各类场景的示例代码,降低新开发者的上手成本,包含接口调用、业务场景、测试等示例。
七、分层职责说明(通用)
客户端:只负责 UI 展示、本地交互、远程接口调用,无业务/数据库代码
服务端:只负责业务逻辑、数据存储、接口提供,无 UI 代码
公共库:只提供前后端通用代码,无业务耦合,可独立打包复用
单体应用:各分层职责与上述一致,通过一体化结构整合前后端能力,适配小型项目、快速开发场景,同时保留DDD分层思想,便于后续拆分为分布式架构。
总结
结构极简:拆分模式下3大核心模块,单体模式下8大分层,均做到边界清晰、一目了然;
拆分便捷:分布式结构可直接独立为Git仓库,单体结构可按需拆分为分布式架构,零成本解耦;
分工明确:前后端/各分层各司其职,后期维护、扩展更高效;
场景适配:同时覆盖分布式拆分、单体一体化两种场景,兼顾大型项目解耦需求和小型项目快速开发需求。