跳到主要内容

CmsKit 子域拆分说明

目标

CmsKit 按子域组织代码、入口和边界,降低内容社区相关能力的认知复杂度。

子域划分

子域关注点当前代表对象
Content内容生产与生命周期ArticleArticleDraftShortMsgChannelClassify
Engagement点赞、评论、收藏、订阅、评分、投票CommentUserLikeBookmarkUserSubscribeRatingPoll
Discovery标签、话题、搜索、推荐、热榜TagTopic、搜索与推荐服务
Governance审核、举报、回收、附件合规边界AuditLogUserReportCommonAttachment
Community用户画像、俱乐部、通知、访问状态CmsUserClubNotificationCurrentVisitUser

为什么这样拆

1. Content

这一层负责“内容本身怎么产生、怎么修改、怎么发布”。它不应该掺杂推荐、通知、治理细节,否则一个文章变更会牵出全链路。

2. Engagement

互动对象天然跨内容类型复用。评论、点赞、收藏、订阅、评分、投票是同一类“互动能力”,应该被当作独立能力带看待,而不是散落在文章、短消息、标签之中。

3. Discovery

搜索建议、MeiliSearch、推荐、热度排序本质上是“分发层”。这层消费内容和互动信号,但不拥有内容生产规则。

4. Governance

审核状态、举报、回收、附件合规决定什么内容能被看见、如何被处理。它对多个子域施加约束,应作为横切但独立的治理子域。

5. Community

用户画像、社团、通知、在线访问状态偏向社区运营,不应该挤进内容生产或搜索分发的脑图里。

当前结构

CmsKit 通过以下几层保持一致:

  1. 目录层
  2. 子域目录索引层
  3. 启动层
  4. 测试层

代码与文档对照

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.cs
  • Controllers/Discovery/SearchController.cs
  • Controllers/Governance/UserReportController.cs
  • Controllers/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 子域边界的统一目录索引。

它回答的是三类问题:

  1. 这个实体属于哪个子域?
    • FindByEntityType(Type)
  2. 这个应用服务属于哪个子域?
    • FindByApplicationServiceType(Type)
  3. 这个控制器属于哪个子域?
    • FindByControllerType(Type)

以及两类聚合问题:

  1. 某个子域下有哪些服务?
    • GetApplicationServiceTypes(...)
  2. 某个子域下有哪些控制器?
    • GetControllerTypes(...)

4. All

CmsKitSubdomains.All 是全部子域定义的总表。

用途:

  • AllEntityTypes 从它聚合出所有需要 SyncStructure 的实体
  • 发现方法从它判断某个类型归属哪个子域
  • 测试遍历它,验证每个子域都能解析出真实代码对象

5. 子域规则

  1. 子域目录与代码归属保持一致
  2. 新增实体先确定所属子域
  3. 新增服务和控制器遵循既有子域边界
  4. 启动同步与测试校验以子域目录索引为准

迁移规则

  1. 子域之间优先通过合同、查询模型或事件协作,不直接穿透到对方内部实现。
  2. Discovery 读取 ContentEngagement 信号,但不反向拥有其规则。
  3. Governance 可以约束公开可见性,但不负责内容编辑体验。
  4. Community 可以消费内容和互动统计,但不改变内容聚合根规则。
  5. 新增实体前,先决定它属于哪个子域,再决定它放在哪个目录。

对团队的实际收益

  • 新同学先认子域,再认文件,不用同时理解整套社区系统。
  • 启动代码、目录结构和文档共享同一套边界定义,减少“文档说一套、代码是一套”。
  • 为后续拆宿主、拆包、拆仓储或拆服务提供稳定基线。