完成 P2 前架构整改

This commit is contained in:
JSD\13999
2026-05-21 11:28:56 +08:00
parent 6e45152250
commit 558bc919ef
15 changed files with 895 additions and 94 deletions

View File

@@ -2,15 +2,15 @@
## Bootstrap
Bootstrap 负责组合运行时依赖,而不是把业务流程写进场景脚本。推荐顺序是创建根 `Container`、注册 Config/Resource/Save/UI/Audio 等服务、注册首个 Feature 的工厂,最后调用 `GameFlow.StartupAsync<TInitialFeature>`
Bootstrap 负责组合运行时依赖,而不是把业务流程写进场景脚本。推荐顺序是创建根 `Container`、注册 Config/Resource/Save/UI/Audio 等服务、用 transient/scoped 生命周期注册首个 Feature最后调用 `GameFlow.StartupAsync<TInitialFeature>`
Bootstrap 必须持有生命周期 `CancellationToken`,退出时先保存必要状态,再调用 `GameFlow.ShutdownAsync`,最后释放预加载资源、音频句柄或其他根级缓存。
Bootstrap 必须持有生命周期 `CancellationToken`,退出时先保存必要状态,再调用 `GameFlow.ShutdownAsync`,最后释放预加载资源、音频句柄或其他根级缓存。样例启动入口应暴露可观察的 `Task` 并统一记录异常,避免在 `Awake` / `OnApplicationQuit` 中直接使用 `async void`
## Container 注册规则
容器注册应显式、可读、可追踪。稳定服务使用 `RegisterInstance`,带运行时参数或 Feature 私有依赖使用 `RegisterFactory`。不要依赖类型扫描或名称约定来猜测注册关系
容器注册应显式、可读、可追踪。稳定外部实例使用 `RegisterInstance`;根级懒加载单例使用 `RegisterSingletonFactory`Feature、ViewModel、短生命周期服务使用 `RegisterTransient``RegisterScoped``RegisterFactory` 仅作为旧式 lazy singleton 兼容入口,不要用于 Feature 或临时业务对象
Feature 只从自己的 scope 解析依赖。跨 Feature 的共享服务放在 root containerFeature 内部临时对象放在 Feature scope并随 `FeatureContext` 一起释放。
Feature 只从自己的 scope 解析依赖。跨 Feature 的共享服务放在 root containerFeature 内部临时对象放在 Feature scope并随 `FeatureContext` 一起释放。父容器中的 transient/scoped 注册被子 scope 解析时,由请求的子 scope 持有和释放singleton 仍由注册所在 scope 持有。
## Feature 生命周期