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; /// /// 设置系统,负责管理和应用各种设置配置 /// 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"); /// /// 应用所有设置配置 /// /// 完成的任务 public async Task ApplyAll() { // 遍历所有设置应用器并尝试应用 foreach (var applicator in _model.AllApplicators()) { await TryApplyAsync(applicator); } } /// /// 应用指定类型的设置配置 /// /// 设置配置类型,必须是类且实现ISettingsSection接口 /// 完成的任务 public Task Apply() where T : class, IApplyAbleSettings { var applicator = _model.GetApplicator(); return applicator != null ? TryApplyAsync(applicator) : Task.CompletedTask; } /// /// 保存所有设置数据到存储库 /// /// 完成的任务 public async Task SaveAll() { // 遍历所有设置数据并保存可持久化的数据 foreach (var data in _model.AllData()) { if (data is IData persistable) { await Repository.SaveAsync(persistable); } } } /// /// 初始化设置系统,获取设置模型实例 /// protected override void OnInit() { _model = this.GetModel()!; _repository ??= this.GetUtility()!; } /// /// 尝试应用可应用的设置配置 /// /// 设置配置对象 private async Task TryApplyAsync(ISettingsSection section) { 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)); } } }