ShrinkContext.AppAdapter
ShrinkApp ↔ ShrinkContext 的桥接层:把现有 IShrinkAppModuleInstaller 生态接入 Cordis 时空可组合性范式(阶段 2 过渡产物,方案见仓库根 CORDIS_MIGRATION.md)。
组成
| 类型 | 职责 |
|---|---|
ShrinkAppInstallerComponent |
安装器 → 组件:DependsOn 映射为 app.module.* 注入键(依赖缺失等待而非抛错);发布模块键;apply = RegisterServices + InitializeAsync |
ShrinkAppLoaderHost |
加载器驱动的 ShrinkApp 宿主:发现安装器(注入覆盖可测试)、经 ShrinkContextLoader 增量协调、SetModuleDisabledAsync 运行中按模块开关、Active/WaitingModuleIds 状态查询、启动发布 ShrinkAppStartedEvent |
ShrinkAppLoaderBootstrapper |
hostingMode == ContextLoader 时在 BeforeSceneLoad 自动创建常驻宿主,并把服务容器接回 ShrinkApp.Services;Classic 模式完全不动 |
启用方式
ShrinkAppSettings.hostingMode 设为 ContextLoader(Inspector 或资产字段)。经典项目默认 ClassicHost,行为零变化。
// 运行中按模块开关(宿主与其余模块不重启)
var host = ShrinkAppLoaderBootstrapper.Instance!.Host;
await host.SetModuleDisabledAsync("shrink.network", true);
行为差异(对照经典 ShrinkAppHost)
| 场景 | ClassicHost | LoaderHost |
|---|---|---|
| 依赖缺失 | 排序期抛错 | 安装器保持 Waiting,依赖出现自动激活 |
| 重复 ModuleId | 宿主级异常 | 构造期抛错(一致);运行期替换退化为供给冲突失败 |
| 运行中禁用模块 | 不支持(需重启) | SetModuleDisabledAsync 增量协调,重启用会重新执行安装器初始化 |
ShrinkApp.IsRunning |
Host 驱动 | 以 ShrinkAppLoaderHost.IsRunning 为准(静态 IsRunning 为 false,过渡期已知差异) |
已知边界
ShrinkAppServices无注销能力:安装器停用不撤回已注册服务(重新启用会重跑 RegisterServices,同键覆盖)。- 配置变化走条目重建而非组件自决 diff(
ShrinkContext.Core加载器原型语义)。 - 编排配置当前由代码构建条目;持久化配置资产(ScriptableObject/JSON)属后续切片。
测试
Tests/ 覆盖:安装器组件 5 项(依赖等待/次序/供给冲突/退役/配置缺失)+ LoaderHost 6 项(启动事件、运行中开关、设置级初始禁用、未知模块、重复 ModuleId、Shutdown)。