# 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`,行为零变化。 ```csharp // 运行中按模块开关(宿主与其余模块不重启) 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)。