diff --git a/docs/zh-CN/game/config-system.md b/docs/zh-CN/game/config-system.md
index 982ab32c..e52ae0c5 100644
--- a/docs/zh-CN/game/config-system.md
+++ b/docs/zh-CN/game/config-system.md
@@ -92,7 +92,7 @@ dropItems:
GameProject/
├─ GameProject.csproj
├─ Config/
-│ ├─ GameConfigBootstrap.cs
+│ ├─ GameConfigHost.cs
│ └─ GameConfigRuntime.cs
├─ config/
│ ├─ monster/
@@ -197,7 +197,12 @@ var slime = monsterTable.Get(1);
bootstrap.Dispose();
```
-如果你希望把它继续包装进自己的进程级入口,也建议只包一层生命周期壳,而不是重新拼装底层加载器:
+如果你希望把它继续包装进自己的进程级入口,也建议只包一层生命周期壳,而不是重新拼装底层加载器。为了避免和后面的“运行时读取模板”冲突,推荐明确拆成两类文件:
+
+- `GameConfigHost.cs` 负责生命周期管理、初始化和热重载
+- `GameConfigRuntime.cs` 负责把已初始化的 `IConfigRegistry` 封装成业务层读取入口
+
+如果你采用这套双层模板,建议把上面的生命周期壳文件命名为 `GameConfigHost.cs`,并把类型名同步改成 `GameConfigHost`:
```csharp
using GFramework.Game.Abstractions.Config;
@@ -209,7 +214,7 @@ namespace GameProject.Config;
///
/// 封装当前游戏进程的配置启动生命周期。
///
-public sealed class GameConfigRuntime : IDisposable
+public sealed class GameConfigHost : IDisposable
{
private readonly GameConfigBootstrap _bootstrap;
@@ -217,7 +222,7 @@ public sealed class GameConfigRuntime : IDisposable
/// 使用指定配置根目录创建运行时入口。
///
/// 配置根目录。
- public GameConfigRuntime(string configRootPath)
+ public GameConfigHost(string configRootPath)
{
_bootstrap = new GameConfigBootstrap(
new GameConfigBootstrapOptions
@@ -240,6 +245,15 @@ public sealed class GameConfigRuntime : IDisposable
return _bootstrap.InitializeAsync();
}
+ ///
+ /// 创建业务层使用的只读配置入口。
+ ///
+ /// 封装强类型表访问的读取入口。
+ public GameConfigRuntime CreateRuntime()
+ {
+ return new GameConfigRuntime(_bootstrap.Registry);
+ }
+
///
/// 释放底层热重载句柄等资源。
///
@@ -262,6 +276,7 @@ public sealed class GameConfigRuntime : IDisposable
推荐不要在业务代码里直接散落字符串表名查询,而是统一依赖生成的强类型入口:
```csharp
+using GFramework.Game.Abstractions.Config;
using GFramework.Game.Config.Generated;
namespace GameProject.Config;
@@ -303,6 +318,16 @@ public sealed class GameConfigRuntime
}
```
+它通常与上面的 `GameConfigHost` 配合使用:
+
+```csharp
+var configHost = new GameConfigHost("config-root");
+await configHost.InitializeAsync();
+
+var runtime = configHost.CreateRuntime();
+var slime = runtime.GetMonster(1);
+```
+
这样做的收益:
- 配置系统对业务层暴露的是强类型表,而不是 `"monster"` 这类 magic string