mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
feat(setting): 更新设置系统支持数据持久化和泛型仓库
- 添加 IDataRepository 依赖注入支持泛型仓库 - 实现 SaveAll 方法用于保存所有设置数据到存储库 - 为 ApplyAll 和 Apply<T> 方法添加返回值类型注释 - 添加 SettingsApplyingEvent 事件发送功能 - 优化代码结构使用泛型约束和空合并运算符 - 添加 Repository 属性确保仓库实例不为空
This commit is contained in:
parent
58291fd85c
commit
2896f35c67
@ -10,10 +10,19 @@ public interface ISettingsSystem : ISystem
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 应用所有可应用的设置
|
/// 应用所有可应用的设置
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <returns>表示异步操作的任务</returns>
|
||||||
Task ApplyAll();
|
Task ApplyAll();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 应用指定类型的设置(泛型版本)
|
/// 应用指定类型的设置(泛型版本)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <typeparam name="T">设置类型,必须是class且实现IApplyAbleSettings接口</typeparam>
|
||||||
|
/// <returns>表示异步操作的任务</returns>
|
||||||
Task Apply<T>() where T : class, IApplyAbleSettings;
|
Task Apply<T>() where T : class, IApplyAbleSettings;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存所有设置
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>表示异步操作的任务</returns>
|
||||||
|
Task SaveAll();
|
||||||
}
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
using GFramework.Core.extensions;
|
using GFramework.Core.extensions;
|
||||||
using GFramework.Core.system;
|
using GFramework.Core.system;
|
||||||
|
using GFramework.Game.Abstractions.data;
|
||||||
using GFramework.Game.Abstractions.setting;
|
using GFramework.Game.Abstractions.setting;
|
||||||
using GFramework.Game.setting.events;
|
using GFramework.Game.setting.events;
|
||||||
|
|
||||||
@ -8,9 +9,12 @@ namespace GFramework.Game.setting;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置系统,负责管理和应用各种设置配置
|
/// 设置系统,负责管理和应用各种设置配置
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SettingsSystem : AbstractSystem, ISettingsSystem
|
public class SettingsSystem<TRepository>(IDataRepository? repository)
|
||||||
|
: AbstractSystem, ISettingsSystem where TRepository : class, IDataRepository
|
||||||
{
|
{
|
||||||
private ISettingsModel _model = null!;
|
private ISettingsModel _model = null!;
|
||||||
|
private IDataRepository? _repository = repository;
|
||||||
|
private IDataRepository Repository => _repository ?? throw new InvalidOperationException("Repository is not set");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 应用所有设置配置
|
/// 应用所有设置配置
|
||||||
@ -18,6 +22,7 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
|
|||||||
/// <returns>完成的任务</returns>
|
/// <returns>完成的任务</returns>
|
||||||
public async Task ApplyAll()
|
public async Task ApplyAll()
|
||||||
{
|
{
|
||||||
|
// 遍历所有设置应用器并尝试应用
|
||||||
foreach (var applicator in _model.AllApplicators())
|
foreach (var applicator in _model.AllApplicators())
|
||||||
{
|
{
|
||||||
await TryApplyAsync(applicator);
|
await TryApplyAsync(applicator);
|
||||||
@ -37,6 +42,22 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
|
|||||||
: Task.CompletedTask;
|
: 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>
|
||||||
/// 初始化设置系统,获取设置模型实例
|
/// 初始化设置系统,获取设置模型实例
|
||||||
@ -44,6 +65,7 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
|
|||||||
protected override void OnInit()
|
protected override void OnInit()
|
||||||
{
|
{
|
||||||
_model = this.GetModel<ISettingsModel>()!;
|
_model = this.GetModel<ISettingsModel>()!;
|
||||||
|
_repository ??= this.GetUtility<TRepository>()!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -54,15 +76,18 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
|
|||||||
{
|
{
|
||||||
if (section is not IApplyAbleSettings applyAbleSettings) return;
|
if (section is not IApplyAbleSettings applyAbleSettings) return;
|
||||||
|
|
||||||
|
// 发送设置应用中事件
|
||||||
this.SendEvent(new SettingsApplyingEvent<ISettingsSection>(section));
|
this.SendEvent(new SettingsApplyingEvent<ISettingsSection>(section));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await applyAbleSettings.Apply();
|
await applyAbleSettings.Apply();
|
||||||
|
// 发送设置应用成功事件
|
||||||
this.SendEvent(new SettingsAppliedEvent<ISettingsSection>(section, true));
|
this.SendEvent(new SettingsAppliedEvent<ISettingsSection>(section, true));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
// 发送设置应用失败事件
|
||||||
this.SendEvent(new SettingsAppliedEvent<ISettingsSection>(section, false, ex));
|
this.SendEvent(new SettingsAppliedEvent<ISettingsSection>(section, false, ex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user