一、整体解决方案项目总览
基于DDD 领域驱动设计分层架构,技术栈:.NET8 + Blazor Server + BootstrapBlazor + PostgreSQL + AspNetCore Identity + Redis缓存,支持后台管理、微信小程序 API 业务代码完全复用,低耦合易扩展。
plaintext
ERP.Solution
├─ 1. ERP.Domain.Shared # 领域共享层(最底层,无外部依赖)
├─ 2. ERP.Application # 应用业务逻辑层
├─ 3. ERP.Infrastructure # 基础设施实现层
├─ 4. ERP.Web.Server # Blazor Server后台管理端(BootstrapBlazor)
├─ 5. ERP.Web.Api # 小程序/移动端接口项目(可选扩展)
测试项目
├─ ERP.UnitTest # 单元测试(领域、应用层逻辑)
└─ ERP.IntegrationTest # 集成测试(数据库完整流程)
二、各分层完整目录、职责、依赖关系
- ERP.Domain.Shared 领域共享层
定位:整个解决方案最底层,仅存放纯粹业务定义,无数据库、UI、第三方 SDK 依赖,所有上层项目统一引用复用。
项目依赖:无任何内部项目引用
plaintext
ERP.Domain.Shared
├─ Entities # 数据库实体(PG表对应实体)
│ ├─ Goods.cs
│ ├─ Stock.cs
│ ├─ SaleOrder.cs
│ ├─ PurchaseOrder.cs
│ ├─ Customer.cs
│ └─ Supplier.cs
├─ Abstractions # 抽象接口:仓储、领域服务(仅定义,不实现)
│ ├─ IStockRepository.cs
│ ├─ ISaleOrderRepository.cs
│ ├─ IPurchaseRepository.cs
│ └─ IUserRepository.cs
├─ Dtos # 全局传输对象(入参/返回值,前后端、小程序通用)
│ ├─ Stock
│ │ ├─ StockQueryDto.cs
│ │ └─ StockResultDto.cs
│ ├─ Sale
│ │ ├─ SaleCreateDto.cs
│ │ └─ SaleListDto.cs
│ └─ Purchase
│ ├─ PurchaseInDto.cs
│ └─ PurchaseResultDto.cs
├─ Enums # 业务枚举:单据状态、库存变动类型、订单来源
│ ├─ OrderStatus.cs
│ └─ StockChangeType.cs
├─ DomainServices # 纯领域计算逻辑(无DB依赖,单元测试核心)
│ └─ StockCalculateService.cs # 库存扣减、加权平均成本计算
└─ Common # 全局通用工具、统一返回模型
├─ ApiResult.cs # 全局接口统一返回格式
└─ ConstConfig.cs # 业务常量 - ERP.Application 应用业务逻辑层
定位:封装全部业务流程,Blazor 后台、小程序 API 统一调用此层,业务代码仅编写一次,实现代码复用。
项目依赖:仅引用 ERP.Domain.Shared
plaintext
ERP.Application
├─ Abstractions # 应用服务抽象接口
│ ├─ IStockAppService.cs
│ ├─ ISaleAppService.cs
│ ├─ IPurchaseAppService.cs
│ └─ IAuthAppService.cs # 登录、注册、权限校验业务接口
├─ Services # 应用服务接口实现
│ ├─ Stock
│ │ └─ StockAppService.cs
│ ├─ Sale
│ │ └─ SaleAppService.cs
│ ├─ Purchase
│ │ └─ PurchaseAppService.cs
│ └─ Auth
│ ├─ AuthAppService.cs
│ └─ AuthHelper.cs # 账号密码、JWT工具封装
└─ Common
└─ ServiceBase.cs # 应用服务基类,封装公共方法 - ERP.Infrastructure 基础设施层
定位:所有外部依赖的实现层,隔离数据库、缓存、第三方 SDK,上层业务仅依赖抽象接口,不感知具体实现。
项目依赖:引用 ERP.Domain.Shared + ERP.Application
plaintext
ERP.Infrastructure
├─ Data
│ ├─ AppDbContext.cs # PostgreSQL EF Core数据库上下文
│ ├─ Migrations # EF数据库迁移文件
│ └─ SeedData # 系统初始化种子数据(管理员账号、商品分类)
├─ Repositories # 仓储接口实现,实现Domain层IxxxRepository
│ ├─ StockRepository.cs
│ ├─ SaleOrderRepository.cs
│ ├─ PurchaseRepository.cs
│ └─ UserRepository.cs
├─ Identity # AspNetCore Identity 用户角色扩展
│ └─ AppUser.cs
├─ Cache # Redis缓存实现(库存缓存、基础数据缓存)
│ └─ RedisCacheService.cs
└─ ExternalServices # 第三方外部服务对接
├─ WeChatMini # 微信小程序SDK(登录、支付)
└─ ExcelExport # Excel单据导出工具类 - ERP.Web.Server Blazor Server 后台管理端
定位:企业后台管理系统,基于 BootstrapBlazor 组件库,提供完整进销存可视化页面、权限管理。
项目依赖:引用 ERP.Domain.Shared + ERP.Application + ERP.Infrastructure
plaintext
ERP.Web.Server
├─ Components # 页面、公共组件(Blazor核心目录)
│ ├─ Pages # 所有业务页面
│ │ ├─ Account # 账号相关页面
│ │ │ ├─ Login.razor
│ │ │ └─ Register.razor
│ │ ├─ Stock # 库存管理页面
│ │ │ ├─ StockIndex.razor
│ │ │ └─ StockWarning.razor
│ │ ├─ Sale # 销售开单、销售记录
│ │ ├─ Purchase # 采购入库、采购单据
│ │ ├─ CustomerSupplier # 客户、供应商档案管理
│ │ └─ System # 系统设置、角色权限、参数配置
│ ├─ Layouts # 全局布局母版
│ │ ├─ MainLayout.razor # 后台主布局(侧边栏菜单+顶部导航)
│ │ ├─ LoginLayout.razor # 登录页面独立布局
│ │ └─ AuthorizeLayout.razor # 全局权限拦截布局
│ ├─ Shared # 全局复用弹窗、公共组件
│ │ ├─ StockDialog.razor
│ │ └─ SaleOrderDialog.razor
│ └─ App.razor # 全局外壳,内置BootstrapBlazorRoot根组件
├─ wwwroot # 静态资源文件(仅Web.Server存放静态资源)
│ ├─ css # 编译后样式文件
│ ├─ scss # 原始SCSS样式源码
│ ├─ images # 图片资源
│ │ ├─ bg # 页面背景图
│ │ └─ icon # 功能图标
│ └─ js # 自定义JS脚本
├─ Services # Blazor页面专属辅助服务
│ └─ GlobalStateService.cs # 全局登录用户状态管理
└─ Program.cs # 项目入口:DI依赖注入、中间件、BootstrapBlazor配置 - ERP.Web.Api 小程序 / 移动端接口项目(可选)
定位:对外提供 RESTful 接口,供微信小程序、APP、H5 调用,底层完全复用 Domain、Application、Infrastructure,无需重复编写业务逻辑。
项目依赖:引用 ERP.Domain.Shared + ERP.Application + ERP.Infrastructure
plaintext
ERP.Web.Api
├─ Controllers
│ ├─ MiniProgramController.cs # 小程序登录、商品查询、下单接口
│ └─ StockController.cs
└─ Program.cs # API项目DI、中间件、JWT鉴权配置
三、测试项目目录 - ERP.UnitTest 单元测试
仅测试领域层、应用层纯逻辑,使用 Moq 模拟仓储,无需真实数据库。
plaintext
ERP.UnitTest
├─ DomainTests # 领域逻辑测试(库存加权成本计算)
└─ ApplicationTests # 应用服务业务流程测试(销售、采购、登录逻辑) - ERP.IntegrationTest 集成测试
使用内存数据库完成完整链路测试,验证仓储、数据库、业务流程联动。
plaintext
ERP.IntegrationTest
├─ Factory # TestServer测试工厂,统一构建测试服务容器
└─ BusinessTests # 完整业务流程集成测试(采购入库、销售出库全链路)
四、项目依赖单向约束(禁止反向依赖)
markdown - ERP.Domain.Shared:无内部项目引用(最底层)
- ERP.Application:仅引用 ERP.Domain.Shared
- ERP.Infrastructure:引用 ERP.Domain.Shared + ERP.Application
- ERP.Web.Server / ERP.Web.Api:引用全部下层三层
- 测试项目:引用 ERP.Domain.Shared + ERP.Application + ERP.Infrastructure
五、分层架构核心优势
业务代码完全复用
库存、销售、账号登录逻辑仅编写一次,Blazor 后台、微信小程序 API 同步复用,无重复代码,降低维护成本。
职责单一,分层解耦
数据库操作仅在 Infrastructure;
业务流程、业务规则仅在 Application/Domain;
UI 页面、交互逻辑仅在 Blazor Web 项目。
单元测试友好
Domain、Application 层无数据库、UI 强耦合依赖,可快速编写单元测试,覆盖库存计算、单据核心业务逻辑。
横向扩展能力强
后续新增 APP、H5、第三方对接接口,仅需新建 WebApi 项目,底层领域、业务、基础设施代码无需改动。
完美适配 BootstrapBlazor
所有页面、布局、弹窗组件统一规范存放,静态资源集中管理,适配 Blazor Server 组件化开发模式。
六、开发规范 & 避坑清单
禁止在 Blazor 页面直接编写库存计算、单据业务逻辑,全部抽离至 Application 应用服务;
禁止页面直接操作 DbContext 数据库上下文,所有数据操作通过 Domain 层仓储接口完成;
数据库实体统一存放于 Domain.Shared,Web/Api 项目禁止重复定义实体类;
图片、样式、JS 静态资源仅允许放置在 ERP.Web.Server/wwwroot,其他项目不存放静态资源;
所有入参、返回 DTO 统一在 Domain.Shared 定义,后台页面、小程序接口共用一套传输模型;
外部第三方依赖(数据库、Redis、微信 SDK)全部封装在 Infrastructure 层,上层业务仅依赖抽象接口。
评论 (0)