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