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()
{
await Repository.SaveAllAsync(_model.AllData());
}
///
/// 重置所有设置并应用更改
///
/// 异步任务
public async Task ResetAll()
{
_model.ResetAll();
await ApplyAll();
}
///
/// 重置指定类型的设置并应用更改
///
/// 设置类型,必须实现IPersistentApplyAbleSettings接口且具有无参构造函数
/// 异步任务
public async Task Reset() where T : class, IPersistentApplyAbleSettings, new()
{
_model.Reset();
await Apply();
}
///
/// 初始化设置系统,获取设置模型实例
///
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));
}
}
}