feat(config): 添加基于YAML的配置加载器和架构验证器

- 实现YamlConfigLoader类,支持从文件目录加载YAML配置
- 添加热重载功能,监听配置文件变更并自动重新加载
- 实现YAML配置架构验证器,支持JSON Schema校验
- 添加跨表引用验证机制,确保配置依赖关系正确
- 支持配置表注册和类型安全的配置项访问
- 实现防抖机制避免频繁的文件变更触发
- 提供详细的错误诊断信息和异常处理
This commit is contained in:
GeWuYou 2026-04-03 12:31:58 +08:00
parent 081a65f740
commit b1e9d0a345
2 changed files with 15 additions and 16 deletions

View File

@ -1,3 +1,4 @@
using System.Diagnostics;
using GFramework.Core.Abstractions.Events;
using GFramework.Game.Abstractions.Config;
using YamlDotNet.Serialization;
@ -299,6 +300,20 @@ public sealed class YamlConfigLoader : IConfigLoader
Func<TValue, TKey> keySelector,
IEqualityComparer<TKey>? comparer)
{
Debug.Assert(!string.IsNullOrWhiteSpace(name), "Table registrations should always have a non-empty name.");
Debug.Assert(!string.IsNullOrWhiteSpace(relativePath),
"Table registrations should always have a non-empty relative path.");
if (string.IsNullOrWhiteSpace(name))
{
throw new ArgumentException(TableNameCannotBeNullOrWhiteSpaceMessage, nameof(name));
}
if (string.IsNullOrWhiteSpace(relativePath))
{
throw new ArgumentException(RelativePathCannotBeNullOrWhiteSpaceMessage, nameof(relativePath));
}
Name = name;
RelativePath = relativePath;
SchemaRelativePath = schemaRelativePath;
@ -365,10 +380,6 @@ public sealed class YamlConfigLoader : IConfigLoader
{
yaml = await File.ReadAllTextAsync(file, cancellationToken);
}
catch (ConfigLoadException)
{
throw;
}
catch (Exception exception)
{
throw ConfigLoadExceptionFactory.Create(
@ -399,10 +410,6 @@ public sealed class YamlConfigLoader : IConfigLoader
values.Add(value);
}
catch (ConfigLoadException)
{
throw;
}
catch (Exception exception)
{
throw ConfigLoadExceptionFactory.Create(
@ -422,10 +429,6 @@ public sealed class YamlConfigLoader : IConfigLoader
var table = new InMemoryConfigTable<TKey, TValue>(values, _keySelector, _comparer);
return new YamlTableLoadResult(Name, table, referencedTableNames, referenceUsages);
}
catch (ConfigLoadException)
{
throw;
}
catch (Exception exception)
{
throw ConfigLoadExceptionFactory.Create(

View File

@ -77,10 +77,6 @@ internal static class YamlConfigSchemaValidator
return new YamlConfigSchema(schemaPath, rootNode, referencedTableNames.ToArray());
}
catch (ConfigLoadException)
{
throw;
}
catch (JsonException exception)
{
throw ConfigLoadExceptionFactory.Create(