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)); } }