CmsKit 子域拆分说明
目标
CmsKit 按子域组织代码、入口和边界,降低内容社区相关能力的认知复杂度。
子域划分
| 子域 | 关注点 | 当前代表对象 |
|---|---|---|
Content | 内容生产与生命周期 | Article、ArticleDraft、ShortMsg、Channel、Classify |
Engagement | 点赞、评论、收藏、订阅、评分、投票 | Comment、UserLike、Bookmark、UserSubscribe、Rating、Poll |
Discovery | 标签、话题、搜索、推荐、热榜 | Tag、Topic、搜索与推荐服务 |
Governance | 审核、举报、回收、附件合规边界 | AuditLog、UserReport、CommonAttachment |
Community | 用户画像、俱乐部、通知、访问状态 | CmsUser、Club、Notification、CurrentVisitUser |
为什么这样拆
1. Content
这一层负责“内容本身怎么产生、怎么修改、怎么发布”。它不应该掺杂推荐、通知、治理细节,否则一个文章变更会牵出全链路。
2. Engagement
互动对象天然跨内容类型复用。评论、点赞、收藏、订阅、评分、投票是同一类“互动能力”,应该被当作独立能力带看待,而不是散落在文章、短消息、标签之中。
3. Discovery
搜索建议、MeiliSearch、推荐、热度排序本质上是“分发层”。这层消费内容和互动信号,但不拥有内容生产规则。
4. Governance
审核状态、举报、回收、附件合规决定什么内容能被看见、如何被处理。它对多个子域施加约束,应作为横切但独立的治理子域。
5. Community
用户画像、社团、通知、在线访问状态偏向社区运营,不应该挤进内容生产或搜索分发的脑图里。
当前结构
CmsKit 通过以下几层保持一致:
- 目录层
- 子域目录索引层
- 启动层
- 测试层
代码与文档对照
1. 物理目录
目录结构:
Application/
Content/
Engagement/
Discovery/
Governance/
Community/
Jobs/
Controllers/
Content/
Engagement/
Discovery/
Governance/
Community/
Admin/
Content/
Engagement/
Discovery/
Governance/
Community/
例如:
Application/Content/Articles/*Application/Discovery/Search/*Application/Governance/UserReports/*Application/Community/Clubs/*Controllers/Content/ArticleController.csControllers/Discovery/SearchController.csControllers/Governance/UserReportController.csControllers/Admin/Content/ArticleController.cs
2. 子域与代码映射
| 文档概念 | 代码位置 | 作用 |
|---|---|---|
| 子域定义 | Architecture/CmsKitSubdomainDefinition.cs | 子域的数据结构 |
| 子域总表 | Architecture/CmsKitSubdomains.cs | 单一事实来源,集中声明边界 |
| 启动接线 | CmsKitModuleStartup.Subdomains.cs | 用子域总表驱动结构同步 |
| 架构验证 | src/Test/FreeKit.Tests/CmsKit/Architecture/CmsKitSubdomainCatalogTests.cs | 防止归属关系漂移 |
3. CmsKitSubdomains
CmsKitSubdomains 是 CmsKit 子域边界的统一目录索引。
它回答的是三类问题:
- 这个实体属于哪个子域?
- 用
FindByEntityType(Type)
- 用
- 这个应用服务属于哪个子域?
- 用
FindByApplicationServiceType(Type)
- 用
- 这个控制器属于哪个子域?
- 用
FindByControllerType(Type)
- 用
以及两类聚合问题:
- 某个子域下有哪些服务?
- 用
GetApplicationServiceTypes(...)
- 用
- 某个子域下有哪些控制器?
- 用
GetControllerTypes(...)
- 用
4. All
CmsKitSubdomains.All 是全部子域定义的总表。
用途:
AllEntityTypes从它聚合出所有需要SyncStructure的实体- 发现方法从它判断某个类型归属哪个子域
- 测试遍历它,验证每个子域都能解析出真实代码对象
5. 子域规则
- 子域目录与代码归属保持一致
- 新增实体先确定所属子域
- 新增服务和控制器遵循既有子域边界
- 启动同步与测试校验以子域目录索引为准
迁移规则
- 子域之间优先通过合同、查询模型或事件协作,不直接穿透到对方内部实现。
Discovery读取Content与Engagement信号,但不反向拥有其规则。Governance可以约束公开可见性,但不负责内容编辑体验。Community可以消费内容和互动统计,但不改变内容聚合根规则。- 新增实体前,先决定它属于哪个子域,再决定它放在哪个目录。
对团队的实际收益
- 新同学先认子域,再认文件,不用同时理解整套社区系统。
- 启动代码、目录结构和文档共享同一套边界定义,减少“文档说一套、代码是一套”。
- 为后续拆宿主、拆包、拆仓储或拆服务提供稳定基线。