feat(cordis): 完成阶段5配置与调试工具
This commit is contained in:
@@ -7,8 +7,10 @@ ShrinkApp ↔ ShrinkContext 的桥接层:把现有 `IShrinkAppModuleInstaller`
|
||||
| 类型 | 职责 |
|
||||
|---|---|
|
||||
| `ShrinkAppInstallerComponent` | 安装器 → 组件:`DependsOn` 映射为 `app.module.*` 注入键(依赖缺失**等待**而非抛错);发布模块键;apply = RegisterServices + InitializeAsync |
|
||||
| `ShrinkAppLoaderHost` | 加载器驱动的 ShrinkApp 宿主:发现安装器(注入覆盖可测试)、经 `ShrinkContextLoader` 增量协调、`SetModuleDisabledAsync` 运行中按模块开关、`Active/WaitingModuleIds` 状态查询、启动发布 `ShrinkAppStartedEvent` |
|
||||
| `ShrinkAppLoaderBootstrapper` | `hostingMode == ContextLoader` 时在 BeforeSceneLoad 自动创建常驻宿主,并把服务容器接回 `ShrinkApp.Services`;Classic 模式完全不动 |
|
||||
| `ShrinkAppLoaderHost` | 加载器驱动的 ShrinkApp 宿主:发现安装器(注入覆盖可测试)、应用声明式组合、经 `ShrinkContextLoader` 增量协调、运行中按模块开关 |
|
||||
| `ShrinkAppCompositionProfile` | ScriptableObject/JSON 组合文档:描述条目启用、显式排除、isolate 与 intercept;组件工厂仍由代码目录注册 |
|
||||
| `ShrinkAppLoaderBootstrapper` | `hostingMode == ContextLoader` 时自动创建常驻宿主,应用 `Resources/ShrinkAppComposition`,并把服务容器接回 `ShrinkApp.Services` |
|
||||
| `ShrinkContextDiagnosticsWindow` | `ShrinkSDK/Cordis/诊断与组合`:查看运行时 fiber/依赖/事务、编辑 Profile JSON、读取可选的 ModFramework 常驻统计并运行容量基准 |
|
||||
|
||||
## 启用方式
|
||||
|
||||
@@ -20,6 +22,39 @@ var host = ShrinkAppLoaderBootstrapper.Instance!.Host;
|
||||
await host.SetModuleDisabledAsync("shrink.network", true);
|
||||
```
|
||||
|
||||
## 声明式组合
|
||||
|
||||
默认资源名为 `Assets/Resources/ShrinkAppComposition.asset`。组合根先用代码注册安装器或原生组件工厂,Bootstrapper 再应用 Profile;配置文件不能通过类型名反射实例化任意组件。
|
||||
|
||||
Profile 的 JSON 结构如下:
|
||||
|
||||
```json
|
||||
{
|
||||
"includeUnlistedEntries": false,
|
||||
"entries": [
|
||||
{
|
||||
"id": "shrink.datasaver",
|
||||
"enabled": true,
|
||||
"isolate": [],
|
||||
"intercept": [
|
||||
{
|
||||
"key": "shrink.service.datasaver",
|
||||
"metadata": [
|
||||
{ "name": "access", "value": "read-only" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
- `includeUnlistedEntries = false` 时,没有列出的已注册模块不会进入 loader。
|
||||
- `ShrinkAppSettings.disabledModuleIds` 与 Profile 的 `enabled = false` 取并集;Profile 不会偷偷启用 Settings 已禁用的模块。
|
||||
- isolate 与 intercept 都在进入 loader 前校验空键和重复键。
|
||||
- intercept metadata 当前是字符串键值,由领域访问策略解释,不是任意对象反序列化入口。
|
||||
- Profile 可引用一个 JSON `TextAsset` 作为覆盖;诊断窗口也支持 JSON 导入、校验、写回和导出。
|
||||
|
||||
## 行为差异(对照经典 ShrinkAppHost)
|
||||
|
||||
| 场景 | ClassicHost | LoaderHost |
|
||||
@@ -32,9 +67,10 @@ await host.SetModuleDisabledAsync("shrink.network", true);
|
||||
## 已知边界
|
||||
|
||||
- `ShrinkAppServices` 无注销能力:安装器停用不撤回已注册服务(重新启用会重跑 RegisterServices,同键覆盖)。
|
||||
- 配置变化走条目重建而非组件自决 diff(`ShrinkContext.Core` 加载器原型语义)。
|
||||
- 编排配置当前由代码构建条目;持久化配置资产(ScriptableObject/JSON)属后续切片。
|
||||
- config/isolate 变化走条目重建;intercept metadata 可原位更新而不改变 fiber generation。
|
||||
- 运行中不支持重新应用整份 Profile;资产修改在下一次宿主启动生效,运行中模块开关仍使用 `SetModuleDisabledAsync`。
|
||||
- Editor 基准的毫秒数和 GC 管理堆差值只用于同机前后对比;自动测试只断言索引候选规模和事务恢复结果。
|
||||
|
||||
## 测试
|
||||
|
||||
`Tests/` 覆盖:安装器组件 5 项(依赖等待/次序/供给冲突/退役/配置缺失)+ LoaderHost 6 项(启动事件、运行中开关、设置级初始禁用、未知模块、重复 ModuleId、Shutdown)。
|
||||
`Tests/` 覆盖安装器生命周期、LoaderHost 开关、原生 Starter 接线、Profile/JSON 校验、显式条目选择、设置禁用优先级,以及 notify/失败恢复结构性基准。
|
||||
|
||||
Reference in New Issue
Block a user