附加文件与配置生成 · 第 7 / 9 篇
目录约定不是装饰,它直接改变输出命名空间身份
当目录约定进入第二案例后,目录层级不再只是文件组织方式,而会正式进入生成器的命名空间决议。
第一季里,命名空间更多还是围绕源码类型本身展开。
但到了第二季,情况变了。
因为配置文件本身并没有像 C# 类型那样天然带着明确的命名空间语义,所以生成器必须自己决定:
- 这些输出类应该落在哪个命名空间
- 子目录结构要不要进入生成结果
这就是目录约定真正开始发挥作用的地方。
为什么目录约定不是“看起来整齐一点”
很多人第一次听到 RelativeDir,会把它理解成一种输出美化:
- 让生成结果更整齐
- 让命名空间分层更漂亮
这只是表面。
真正重要的是,目录约定会进入最终分组键里的 namespace。
也就是说,一旦目录约定生效,它影响的不是显示效果,而是输出目标身份本身。
为什么它一定要依附在项目语义上
如果你直接根据绝对路径拼命名空间,会立刻把本机目录结构混进输出:
- 机器换了,路径变了
- CI 和本地环境不一致
- 测试环境和真实构建也可能不一致
所以第二案例更合理的做法,是只读取项目语义下显式暴露的 RelativeDir。
这点很关键,因为它说明:
目录约定不是“读磁盘”,而是在读项目结构信息。
为什么它和全局默认命名空间要一起看
目录约定本身不是独立命名空间来源。
更准确地说,它是在:
- 全局默认命名空间
之上追加一层目录后缀。
所以第二案例里更稳的理解应该是:
- 全局默认命名空间给出根
RelativeDir决定后缀
这也是为什么一旦文件级命名空间已经显式给出,目录约定就必须让位。否则你就会得到两套彼此打架的命名空间来源。
为什么这一步会影响分组结果
因为第二案例真正看的是最终 namespace + className。
这意味着,即使两个文件类名一样,只要目录约定让命名空间不同,它们也不该进入同一输出组。
所以目录约定不是后期排版,而是直接参与输出身份决议。
真实价值在哪里
第二案例真正引入目录约定,不是为了让教程更花哨,而是为了支持更接近项目结构的输出组织。
例如:
- 基础资源留在根命名空间
- 管理区资源自然进入
Areas.Admin - 不同目录下的配置天然形成不同命名空间层次
这样消费方看到的生成结果,才会像项目里真正能长期维护的结构,而不是一堆平铺类名。
一句话结论
只要目录约定进入第二案例,它就不再是文件组织的小技巧,而是正式进入命名空间和分组身份的一层规则。
教程导航
继续阅读
当前文章已经挂到教程顺序中,建议按相邻章节继续。