GFramework/GFramework.Game/setting/SettingsSystem.cs
GeWuYou 2896f35c67 feat(setting): 更新设置系统支持数据持久化和泛型仓库
- 添加 IDataRepository 依赖注入支持泛型仓库
- 实现 SaveAll 方法用于保存所有设置数据到存储库
- 为 ApplyAll 和 Apply<T> 方法添加返回值类型注释
- 添加 SettingsApplyingEvent 事件发送功能
- 优化代码结构使用泛型约束和空合并运算符
- 添加 Repository 属性确保仓库实例不为空
2026-01-28 23:01:46 +08:00

94 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using GFramework.Core.extensions;
using GFramework.Core.system;
using GFramework.Game.Abstractions.data;
using GFramework.Game.Abstractions.setting;
using GFramework.Game.setting.events;
namespace GFramework.Game.setting;
/// <summary>
/// 设置系统,负责管理和应用各种设置配置
/// </summary>
public class SettingsSystem<TRepository>(IDataRepository? repository)
: AbstractSystem, ISettingsSystem where TRepository : class, IDataRepository
{
private ISettingsModel _model = null!;
private IDataRepository? _repository = repository;
private IDataRepository Repository => _repository ?? throw new InvalidOperationException("Repository is not set");
/// <summary>
/// 应用所有设置配置
/// </summary>
/// <returns>完成的任务</returns>
public async Task ApplyAll()
{
// 遍历所有设置应用器并尝试应用
foreach (var applicator in _model.AllApplicators())
{
await TryApplyAsync(applicator);
}
}
/// <summary>
/// 应用指定类型的设置配置
/// </summary>
/// <typeparam name="T">设置配置类型必须是类且实现ISettingsSection接口</typeparam>
/// <returns>完成的任务</returns>
public Task Apply<T>() where T : class, IApplyAbleSettings
{
var applicator = _model.GetApplicator<T>();
return applicator != null
? TryApplyAsync(applicator)
: Task.CompletedTask;
}
/// <summary>
/// 保存所有设置数据到存储库
/// </summary>
/// <returns>完成的任务</returns>
public async Task SaveAll()
{
// 遍历所有设置数据并保存可持久化的数据
foreach (var data in _model.AllData())
{
if (data is IData persistable)
{
await Repository.SaveAsync(persistable);
}
}
}
/// <summary>
/// 初始化设置系统,获取设置模型实例
/// </summary>
protected override void OnInit()
{
_model = this.GetModel<ISettingsModel>()!;
_repository ??= this.GetUtility<TRepository>()!;
}
/// <summary>
/// 尝试应用可应用的设置配置
/// </summary>
/// <param name="section">设置配置对象</param>
private async Task TryApplyAsync(ISettingsSection section)
{
if (section is not IApplyAbleSettings applyAbleSettings) return;
// 发送设置应用中事件
this.SendEvent(new SettingsApplyingEvent<ISettingsSection>(section));
try
{
await applyAbleSettings.Apply();
// 发送设置应用成功事件
this.SendEvent(new SettingsAppliedEvent<ISettingsSection>(section, true));
}
catch (Exception ex)
{
// 发送设置应用失败事件
this.SendEvent(new SettingsAppliedEvent<ISettingsSection>(section, false, ex));
}
}
}