refactor(setting): 重构设置系统的接口设计

- 移除 SettingsModel 中的 All() 方法,避免同时实现两个接口的设置被重复返回
- 添加 AllApplicators() 方法用于获取所有可应用设置
- 添加 AllData() 方法用于获取所有设置数据
- 修改 SettingsSystem.ApplyAll() 方法,直接遍历可应用设置而非设置节
- 更新 ISettingsModel 接口定义,将 All() 方法拆分为 AllData() 和 AllApplicators()
- 移除 SettingsSystem 中的 Apply(Type) 和 Apply(IEnumerable<Type>) 重载方法
- 更新 Apply<T>() 泛型约束从 ISettingsSection 改为 IApplyAbleSettings
- 移除注册时对 ISettingsData 的自动注册逻辑,保持职责分离
This commit is contained in:
GeWuYou 2026-01-27 22:11:01 +08:00
parent 19c0830a7d
commit 07f5d27ab3
4 changed files with 39 additions and 71 deletions

View File

@ -30,10 +30,17 @@ public interface ISettingsModel : IModel
T? GetApplicator<T>() where T : class, IApplyAbleSettings;
/// <summary>
/// 获取所有设置节的集合
/// 获取所有设置数据的集合
/// </summary>
/// <returns>包含所有设置节的可枚举集合</returns>
IEnumerable<ISettingsSection> All();
/// <returns>包含所有设置数据的可枚举集合</returns>
IEnumerable<ISettingsData> AllData();
/// <summary>
/// 获取所有可应用设置的集合
/// </summary>
/// <returns>包含所有可应用设置的可枚举集合</returns>
IEnumerable<IApplyAbleSettings> AllApplicators();
/// <summary>
/// 注册可应用设置(必须手动注册)

View File

@ -12,18 +12,8 @@ public interface ISettingsSystem : ISystem
/// </summary>
Task ApplyAll();
/// <summary>
/// 应用指定类型的设置
/// </summary>
Task Apply(Type settingsType);
/// <summary>
/// 应用指定类型的设置(泛型版本)
/// </summary>
Task Apply<T>() where T : class, ISettingsSection;
/// <summary>
/// 批量应用多个设置类型
/// </summary>
Task Apply(IEnumerable<Type> settingsTypes);
Task Apply<T>() where T : class, IApplyAbleSettings;
}

View File

@ -32,6 +32,15 @@ public class SettingsModel : AbstractModel, ISettingsModel
return created;
}
/// <summary>
/// 获取所有已注册的可应用设置
/// </summary>
/// <returns>所有可应用设置的枚举集合</returns>
public IEnumerable<IApplyAbleSettings> AllApplicators()
{
return _applicators.Values;
}
/// <summary>
/// 注册可应用设置(必须手动注册)
/// </summary>
@ -42,13 +51,6 @@ public class SettingsModel : AbstractModel, ISettingsModel
{
var type = typeof(T);
_applicators[type] = applicator;
// 如果这个应用设置同时也是数据设置,也注册到数据字典中
if (applicator is ISettingsData data)
{
_dataSettings[type] = data;
}
return this;
}
@ -65,6 +67,15 @@ public class SettingsModel : AbstractModel, ISettingsModel
: null;
}
/// <summary>
/// 获取所有设置数据
/// </summary>
/// <returns>所有设置数据的枚举集合</returns>
public IEnumerable<ISettingsData> AllData()
{
return _dataSettings.Values;
}
/// <summary>
/// 尝试获取指定类型的设置节
/// </summary>
@ -91,27 +102,11 @@ public class SettingsModel : AbstractModel, ISettingsModel
return false;
}
/// <summary>
/// 获取所有设置节的集合
/// </summary>
/// <returns>包含所有设置节的可枚举集合</returns>
public IEnumerable<ISettingsSection> All()
{
// 使用 HashSet 去重(避免同时实现两个接口的设置被重复返回)
var sections = new HashSet<ISettingsSection>();
foreach (var applicator in _applicators.Values)
sections.Add(applicator);
foreach (var data in _dataSettings.Values)
sections.Add(data);
return sections;
}
/// <summary>
/// 初始化并加载指定类型的设置数据
/// </summary>
/// <param name="settingTypes">要初始化的设置类型数组</param>
public async Task InitializeAsync(params Type[] settingTypes)
{
foreach (var type in settingTypes)

View File

@ -18,8 +18,10 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
/// <returns>完成的任务</returns>
public async Task ApplyAll()
{
// 遍历所有设置配置并尝试应用
foreach (var section in _model.All()) await TryApplyAsync(section);
foreach (var applicator in _model.AllApplicators())
{
await TryApplyAsync(applicator);
}
}
/// <summary>
@ -27,40 +29,14 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem
/// </summary>
/// <typeparam name="T">设置配置类型必须是类且实现ISettingsSection接口</typeparam>
/// <returns>完成的任务</returns>
public Task Apply<T>() where T : class, ISettingsSection
public Task Apply<T>() where T : class, IApplyAbleSettings
{
return Apply(typeof(T));
var applicator = _model.GetApplicator<T>();
return applicator != null
? TryApplyAsync(applicator)
: Task.CompletedTask;
}
/// <summary>
/// 应用指定类型的设置配置
/// </summary>
/// <param name="settingsType">设置配置类型</param>
/// <returns>完成的任务</returns>
public async Task Apply(Type settingsType)
{
if (_model.TryGet(settingsType, out var section))
{
await TryApplyAsync(section);
}
}
/// <summary>
/// 应用指定类型集合的设置配置
/// </summary>
/// <param name="settingsTypes">设置配置类型集合</param>
/// <returns>完成的任务</returns>
public async Task Apply(IEnumerable<Type> settingsTypes)
{
// 去重后遍历设置类型,获取并应用对应的设置配置
foreach (var type in settingsTypes.Distinct())
{
if (_model.TryGet(type, out var section))
{
await TryApplyAsync(section);
}
}
}
/// <summary>
/// 初始化设置系统,获取设置模型实例