系统架构总览
FreeKitModules 的主形态是一个模块化单体:CmsKit、Identity、Member 和 Platform 在同一进程中组合,但各自保留业务边界。HTTP 接入层与核心业务程序集分开,使 API、调度和消息处理宿主可以按职责加载不同能力。
运行时边界
auth/、basic/ 和 cg/ 有自己的解决方案与宿主,不属于 FreeKit.Host 进程内模块。它们与主模块共享部分 FreeKit 包,但部署边界独立。
模块项目的两层拆分
| 项目类型 | 放置内容 | 可被哪些宿主引用 |
|---|---|---|
FreeKit.<Module> | Domain、Application、Contracts、Runtime、持久化配置 | API、Job、Message |
FreeKit.<Module>.HttpApi | Controllers、SignalR Hubs、HTTP 专属模块注册 | 主 API Host |
当前采用这一拆分的模块包括 CmsKit、Identity、Member 和 Platform。依赖方向必须是 *.HttpApi → 核心项目,核心项目不能反向引用 HttpApi。
主 API 的组合过程
src/Services/Host/FreeKit.Host/Program.cs 同时完成两件事:
- 显式注册 CmsKit、Identity、Platform、Member 的核心
ModuleStartup,让业务服务和领域能力进入 DI。 - 基于
E.Modules构造hostModules,把四个同名模块键替换为对应*HttpApiModuleStartup;随后调用UseFreeKit注册 Controller 程序集,并通过extraAssemblies把核心程序集加入 Autofac 扫描。
src/Services/Host/FreeKit.DI/E.cs 仍是 Job、Message 等后台宿主的核心模块映射。只从该字典删除模块,会影响这些后台宿主;主 API 还存在显式核心注册和 HttpApi 映射,因此调整模块组合时必须同时检查 E.cs 与 FreeKit.Host/Program.cs。
请求链路
- Controller 只负责 HTTP 契约、参数绑定和转发。
- Application Service 编排用例,并在这里处理权限、资源所有权和事务边界。
- Domain Manager 封装领域规则或复杂数据操作。
- Application 与 Controller 不新增
IFreeSql直接依赖;数据访问通过IAuditBaseRepository<T>或 Domain Manager。 - 控制器继承
FreeKitController后默认要求认证,匿名端点必须显式标注[AllowAnonymous]。
共享构建块
src/BuildingBlocks/ 为所有业务模块提供仓库基础设施:
| 项目 | 职责 |
|---|---|
IGeekFan.FreeKit.Infrastructure | Controller/Application 基类、权限、本地化、中间件、日志与 CAP 集成 |
IGeekFan.FreeKit.Web | Host 组合、Autofac 扫描、Web 配置、OpenTelemetry |
IGeekFan.FreeKit.Auth.Client | 独立授权服务的客户端接入 |
IGeekFan.FreeKit.CLI | 命令行与脚手架能力 |
这些是仓库内部 ProjectReference,不要在文档或业务代码中把它们当成可独立安装的 NuGet 包。
扩展一个模块时
- 先确定业务边界和聚合,不要按数据库表机械拆模块。
- 将实体、Manager、Application Service 和 Contracts 放入核心项目。
- 需要 HTTP 时创建/使用
*.HttpApi项目放置 Controller。 - 分别实现核心与 HttpApi 的
IModuleStartup。 - 检查
FreeKit.DI/E.cs、FreeKit.Host/Program.cs、项目引用和解决方案条目。 - 增加 Domain/Application/API/Architecture 对应层级的测试。
完整流程见创建业务模块。
相关源码
src/Services/Host/FreeKit.Host/Program.cssrc/Services/Host/FreeKit.DI/E.cssrc/BuildingBlocks/IGeekFan.FreeKit.Web/DI/WebApplicationBuilderExtensions.cssrc/FreeKit/src/IGeekFan.FreeKit.Modularity/ModuleServiceCollection.cssrc/FreeKit/src/IGeekFan.FreeKit.Modularity/ModuleApplicationBuilderExtensions.cs