41 lines
2.4 KiB
Markdown
41 lines
2.4 KiB
Markdown
# 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)。
|