using GFramework.Core.Abstractions.storage; using GFramework.Core.extensions; using GFramework.Core.utility; using GFramework.Game.Abstractions.setting; using GFramework.Game.setting.events; namespace GFramework.Game.setting; /// /// 设置持久化服务类,负责处理设置数据的加载、保存、删除等操作 /// public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence { private IStorage _storage = null!; /// /// 异步加载指定类型的设置数据 /// /// 设置数据类型,必须实现ISettingsData接口 /// 如果存在则返回存储的设置数据,否则返回新创建的实例 public async Task LoadAsync() where T : class, ISettingsData, new() { var key = GetKey(); if (await _storage.ExistsAsync(key)) { var result = await _storage.ReadAsync(key); this.SendEvent(new SettingsLoadedEvent(result)); return result; } var newSettings = new T(); this.SendEvent(new SettingsLoadedEvent(newSettings)); return newSettings; } /// /// 异步保存设置数据到存储中 /// /// 设置数据类型,必须实现ISettingsData接口 /// 要保存的设置数据实例 public async Task SaveAsync(T section) where T : class, ISettingsData { var key = GetKey(); await _storage.WriteAsync(key, section); this.SendEvent(new SettingsSavedEvent(section)); } /// /// 检查指定类型的设置数据是否存在 /// /// 设置数据类型,必须实现ISettingsData接口 /// 如果存在返回true,否则返回false public async Task ExistsAsync() where T : class, ISettingsData { var key = GetKey(); return await _storage.ExistsAsync(key); } /// /// 异步删除指定类型的设置数据 /// /// 设置数据类型,必须实现ISettingsData接口 public async Task DeleteAsync() where T : class, ISettingsData { var key = GetKey(); await _storage.DeleteAsync(key); this.SendEvent(new SettingsDeletedEvent(typeof(T))); await Task.CompletedTask; } /// /// 异步保存所有设置数据到存储中 /// /// 包含所有设置数据的可枚举集合 public async Task SaveAllAsync(IEnumerable allData) { var dataList = allData.ToList(); foreach (var data in dataList) { var type = data.GetType(); var key = GetKey(type); await _storage.WriteAsync(key, data); } this.SendEvent(new SettingsBatchSavedEvent(dataList)); } protected override void OnInit() { _storage = this.GetUtility()!; } /// /// 获取指定类型的存储键名 /// /// 设置数据类型 /// 格式为"Settings_类型名称"的键名 private static string GetKey() where T : ISettingsData { return GetKey(typeof(T)); } /// /// 获取指定类型的存储键名 /// /// 设置数据类型 /// 格式为"Settings_类型名称"的键名 private static string GetKey(Type type) { return $"Settings_{type.Name}"; } }