附加文件与配置生成 · 第 7 / 9 篇

目录约定不是装饰,它直接改变输出命名空间身份

当目录约定进入第二案例后,目录层级不再只是文件组织方式,而会正式进入生成器的命名空间决议。

第一季里,命名空间更多还是围绕源码类型本身展开。

但到了第二季,情况变了。

因为配置文件本身并没有像 C# 类型那样天然带着明确的命名空间语义,所以生成器必须自己决定:

  • 这些输出类应该落在哪个命名空间
  • 子目录结构要不要进入生成结果

这就是目录约定真正开始发挥作用的地方。

为什么目录约定不是“看起来整齐一点”

很多人第一次听到 RelativeDir,会把它理解成一种输出美化:

  • 让生成结果更整齐
  • 让命名空间分层更漂亮

这只是表面。

真正重要的是,目录约定会进入最终分组键里的 namespace

也就是说,一旦目录约定生效,它影响的不是显示效果,而是输出目标身份本身。

为什么它一定要依附在项目语义上

如果你直接根据绝对路径拼命名空间,会立刻把本机目录结构混进输出:

  • 机器换了,路径变了
  • CI 和本地环境不一致
  • 测试环境和真实构建也可能不一致

所以第二案例更合理的做法,是只读取项目语义下显式暴露的 RelativeDir

这点很关键,因为它说明:

目录约定不是“读磁盘”,而是在读项目结构信息。

为什么它和全局默认命名空间要一起看

目录约定本身不是独立命名空间来源。

更准确地说,它是在:

  • 全局默认命名空间

之上追加一层目录后缀。

所以第二案例里更稳的理解应该是:

  • 全局默认命名空间给出根
  • RelativeDir 决定后缀

这也是为什么一旦文件级命名空间已经显式给出,目录约定就必须让位。否则你就会得到两套彼此打架的命名空间来源。

为什么这一步会影响分组结果

因为第二案例真正看的是最终 namespace + className

这意味着,即使两个文件类名一样,只要目录约定让命名空间不同,它们也不该进入同一输出组。

所以目录约定不是后期排版,而是直接参与输出身份决议。

真实价值在哪里

第二案例真正引入目录约定,不是为了让教程更花哨,而是为了支持更接近项目结构的输出组织。

例如:

  • 基础资源留在根命名空间
  • 管理区资源自然进入 Areas.Admin
  • 不同目录下的配置天然形成不同命名空间层次

这样消费方看到的生成结果,才会像项目里真正能长期维护的结构,而不是一堆平铺类名。

一句话结论

只要目录约定进入第二案例,它就不再是文件组织的小技巧,而是正式进入命名空间和分组身份的一层规则。

教程导航

继续阅读

当前文章已经挂到教程顺序中,建议按相邻章节继续。

上一篇 一次生成能产出多少个类,分组键早就决定了 第二案例里,多输出组并存不是额外能力,而是分组键稳定之后自然出现的结果。 下一篇 共享资源键很脏时,前缀裁剪是在保护输出 API 前缀裁剪不是为了少打一段字符串,它真正解决的是共享资源键命名和最终生成 API 之间的边界污染。
查看系列目录 查看全部文章

标签

分类