From 2896f35c67f32eb7897374385a49b0a3b9c507f8 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Wed, 28 Jan 2026 23:01:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(setting):=20=E6=9B=B4=E6=96=B0=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E7=B3=BB=E7=BB=9F=E6=94=AF=E6=8C=81=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=8C=81=E4=B9=85=E5=8C=96=E5=92=8C=E6=B3=9B=E5=9E=8B=E4=BB=93?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 IDataRepository 依赖注入支持泛型仓库 - 实现 SaveAll 方法用于保存所有设置数据到存储库 - 为 ApplyAll 和 Apply 方法添加返回值类型注释 - 添加 SettingsApplyingEvent 事件发送功能 - 优化代码结构使用泛型约束和空合并运算符 - 添加 Repository 属性确保仓库实例不为空 --- .../setting/ISettingsSystem.cs | 9 +++++++ GFramework.Game/setting/SettingsSystem.cs | 27 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/GFramework.Game.Abstractions/setting/ISettingsSystem.cs b/GFramework.Game.Abstractions/setting/ISettingsSystem.cs index 34ed148..6faf516 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsSystem.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsSystem.cs @@ -10,10 +10,19 @@ public interface ISettingsSystem : ISystem /// /// 应用所有可应用的设置 /// + /// 表示异步操作的任务 Task ApplyAll(); /// /// 应用指定类型的设置(泛型版本) /// + /// 设置类型,必须是class且实现IApplyAbleSettings接口 + /// 表示异步操作的任务 Task Apply() where T : class, IApplyAbleSettings; + + /// + /// 保存所有设置 + /// + /// 表示异步操作的任务 + Task SaveAll(); } \ No newline at end of file diff --git a/GFramework.Game/setting/SettingsSystem.cs b/GFramework.Game/setting/SettingsSystem.cs index 37ebe28..291e9d9 100644 --- a/GFramework.Game/setting/SettingsSystem.cs +++ b/GFramework.Game/setting/SettingsSystem.cs @@ -1,5 +1,6 @@ using GFramework.Core.extensions; using GFramework.Core.system; +using GFramework.Game.Abstractions.data; using GFramework.Game.Abstractions.setting; using GFramework.Game.setting.events; @@ -8,9 +9,12 @@ namespace GFramework.Game.setting; /// /// 设置系统,负责管理和应用各种设置配置 /// -public class SettingsSystem : AbstractSystem, ISettingsSystem +public class SettingsSystem(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"); /// /// 应用所有设置配置 @@ -18,6 +22,7 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem /// 完成的任务 public async Task ApplyAll() { + // 遍历所有设置应用器并尝试应用 foreach (var applicator in _model.AllApplicators()) { await TryApplyAsync(applicator); @@ -37,6 +42,22 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem : Task.CompletedTask; } + /// + /// 保存所有设置数据到存储库 + /// + /// 完成的任务 + public async Task SaveAll() + { + // 遍历所有设置数据并保存可持久化的数据 + foreach (var data in _model.AllData()) + { + if (data is IData persistable) + { + await Repository.SaveAsync(persistable); + } + } + } + /// /// 初始化设置系统,获取设置模型实例 @@ -44,6 +65,7 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem protected override void OnInit() { _model = this.GetModel()!; + _repository ??= this.GetUtility()!; } /// @@ -54,15 +76,18 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem { if (section is not IApplyAbleSettings applyAbleSettings) return; + // 发送设置应用中事件 this.SendEvent(new SettingsApplyingEvent(section)); try { await applyAbleSettings.Apply(); + // 发送设置应用成功事件 this.SendEvent(new SettingsAppliedEvent(section, true)); } catch (Exception ex) { + // 发送设置应用失败事件 this.SendEvent(new SettingsAppliedEvent(section, false, ex)); } }