vampire-like/docs/AssemblyOrganization.md

8.9 KiB
Raw Permalink Blame History

SepCore 程序集组织规范

本文档定义 Assets/GameMain/Scripts 下 C# 代码的程序集Assembly Definition拆分规则用于指导新代码的归属判断和现有代码的维护。


1. 设计原则

1.1 核心约束

  • 单向依赖:下层不引用上层,上层可以引用下层。
  • GameEntry 红线:凡是有 GameEntry. 引用的代码,一律不能放在 Base
  • 框架适配UnityGameFramework 是组件化平级协作架构,GameEntry 作为全局访问点天然要求它能看到所有 Component。因此 Component 及其扩展方法统一归到 Runtime不放在 Base。

1.2 依赖方向

SepCore.Procedure编排层
    ↓ 可引用
SepCore.Presentation表现层
    ↓ 可引用
SepCore.Runtime运行时基础设施层
    ↓ 可引用
SepCore.Base核心定义层

Editor 程序集独立,引用除 Presentation 外的所有运行时程序集:

SepCore.Editor
    ↓ 可引用
SepCore.Procedure / SepCore.Runtime / SepCore.Base / UnityGameFramework.*

2. 各层职责与判断标准

2.1 SepCore.Base — 核心定义层

定位:最稳定、最少变化、零外部依赖的纯基础设施。

判断标准

  • 不引用 GameEntry
  • 不引用任何自定义 MonoBehaviour Component
  • 不引用 UnityGameFramework.Runtime 中的具体 Component框架基础类型如 EntityLogic 除外)
  • 以数据结构、常量、枚举、纯算法为主

当前归属目录

目录 说明
Base/DataTable/ DR* 数据表行定义、BinaryReaderExtensionDataTableExtension
Base/Definition/Constant/ Constant.* 常量
Base/Definition/DataStruct/ BuildInfoVersionInfo 等纯数据结构
Base/Definition/Enum/ SceneTypeUIFormType 等枚举
Base/Entity/EntityData/ EntityDataBase(纯数据类)
Base/Entity/EntityLogic/ EntityBase(继承框架 EntityLogic,无 GameEntry 引用)
Base/Utility/ AssetUtilityWebUtilityLitJsonHelper(纯静态工具)

2.2 SepCore.Runtime — 运行时基础设施层

定位:所有 GameFrameworkComponent、全局访问点GameEntry、以及对框架组件的扩展方法。

判断标准

  • 包含 GameEntry. 引用
  • 继承或扩展框架 ComponentDefaultLocalizationHelperUIFormLogic
  • SoundComponentUIComponentEntityComponent 等做扩展方法
  • 自定义的 GameFrameworkComponentBuiltinDataComponent

当前归属目录

目录 说明
Runtime/BuiltinComponent/ EntityExtensionSoundExtensionUIComponentExtensionXmlLocalizationHelper
Runtime/UIBase/ UGuiForm(基类)、UIExtensionDialogParamsUGuiGroupHelperCommonButton
Runtime/Base/ GameEntry.csGameEntry.Builtin.csGameEntry.Custom.cs
Runtime/CustomComponent/BuiltinData/ BuiltinDataComponent.cs
Runtime/Debugger/ ChangeLanguageDebuggerWindow.cs

引用配置

  • UnityGameFramework.Runtime
  • GameFramework
  • SepCore.Base

2.3 SepCore.Presentation — 表现层

定位:最顶层的业务 UIForm只包含具体界面的逻辑不含可复用的 UI 基础设施。

判断标准

  • 继承 UGuiFormRuntime 层基类)或直接继承 MonoBehaviour
  • 不向外暴露被其他 Component/Procedure 直接引用的类型(除非通过 GameObject 或基类解耦)
  • 允许调用 GameEntry.*

当前归属目录

目录 说明
UI/ DialogFormUpdateResourceForm

引用配置

  • SepCore.Runtime
  • SepCore.Base
  • UnityGameFramework.Runtime
  • GameFramework

2.4 SepCore.Procedure — 编排层

定位游戏生命周期流程Procedure作为最顶层协调者可以引用所有人。

判断标准

  • 继承 ProcedureBase
  • 直接引用具体 UIForm 类型(如 UpdateResourceForm)是允许的,因为 Procedure 是最顶层

当前归属目录

目录 说明
Procedure/ ProcedureBase + 所有 Procedure 子类

引用配置

  • SepCore.Presentation
  • SepCore.Runtime
  • SepCore.Base
  • UnityGameFramework.Runtime
  • GameFramework

2.5 SepCore.Editor — 编辑器扩展层

定位:编辑器工具、自定义 Inspector、构建事件等仅在 Editor 下编译。

引用配置

  • UnityGameFramework.Editor
  • UnityGameFramework.Runtime
  • SepCore.Runtime
  • SepCore.Base
  • GameFramework

注意Editor 不引用 SepCore.Presentation,避免编辑器逻辑依赖业务表现层。


3. 程序集引用矩阵

引用方 \ 被引用方 Base Runtime Presentation Procedure Editor
Base
Runtime
Presentation
Procedure
Editor

4. 常见反模式

4.1 Base 层引用 GameEntry

错误:把 XmlLocalizationHelperChangeLanguageDebuggerWindow 等引用 GameEntry 的文件放在 Base。

正确:凡是调用 GameEntry.* 的文件,一律放到 Runtime 或更高层。

4.2 Runtime 层引用 Presentation 的具体类型

错误BuiltinDataComponent 持有 UpdateResourceForm 类型的字段。

正确BuiltinDataComponent 暴露 GameObject,由 Procedure最顶层通过 GetComponent<UpdateResourceForm>() 获取。

4.3 GameEntry 留在 Base

错误GameEntry.Custom.cs 引用了 BuiltinDataComponentRuntimeGameEntry 放在 Base。

正确GameEntry 的所有 partial 文件必须和 BuiltinDataComponent 在同一程序集,即 Runtime。

4.4 扩展方法乱放在 Utility/

错误:把 SoundComponent.PlayMusic 这类扩展方法放在 Utility/SoundExtension.cs

正确:对 Component 的扩展方法跟着被扩展方走,放在 BuiltinComponent/Runtime或按模块分散到各子系统的 Runtime 目录中。


5. 命名空间约定

程序集拆分后,命名空间保持与原始文件夹路径一致,便于代码导航:

程序集 命名空间示例
SepCore.Base SepCore.DataTableSepCore.DefinitionSepCore.Utility
SepCore.Runtime SepCore.Runtime(根命名空间)、SepCore.UISepCore.EntitySepCore.Sound
SepCore.Presentation SepCore.UI(与 Runtime 共享,因为 DialogForm 等原本就在 SepCore.UI
SepCore.Procedure SepCore.Procedure
SepCore.Editor SepCore.Editor

允许 Runtime 和 Presentation 共享同一个根命名空间(如 SepCore.UI),因为 C# 命名空间可以跨程序集。Presentation 的 DialogFormSepCore.UIRuntime 的 UGuiForm 也在 SepCore.UI 下,这是合法的。


6. 新增代码决策流程

当不确定新文件该放哪一层时,按以下顺序判断:

  1. 是否只在 Editor 使用?SepCore.Editor
  2. 是否继承 ProcedureBaseSepCore.Procedure
  3. 是否继承 UGuiFormMonoBehaviour 且是具体业务界面?SepCore.Presentation
  4. 是否引用 GameEntry、是否是 Component、是否是对 Component 的扩展?SepCore.Runtime
  5. 其余所有纯数据/定义/工具SepCore.Base