
以下文章来源于CodeSpirit-码灵,作者magiccodes
CodeSpirit.Settings是码灵框架中的设置管理组件,提供了一套完整的应用配置管理解决方案。该组件支持全局设置和用户个性化设置管理,可以方便地对应用程序的各种配置进行集中管理,同时保留配置历史记录以便审计和回滚。


// 注入设置服务
privatereadonly ISettingsService _settingsService;
public MyService(ISettingsService settingsService)
{
_settingsService = settingsService;
}
// 方式一:传统方式(需要手动传入 module 和 key)
varvalue = await _settingsService.GetGlobalSettingAsync("System", "Theme");
var userValue = await _settingsService.GetUserSettingAsync("System", "Theme", userId);
var config = await _settingsService.GetGlobalSettingAsync<AppConfig>("System", "Configuration");
// 方式二:使用 SettingsDto 特性(推荐,避免字符串拼写错误)
// 1. 定义 DTO 并添加特性
[SettingsDto("System", "Theme")]
publicclassThemeSettingsDto
{
publicstring Theme { get; set; } = "Light";
}
// 2. 使用简化 API(自动从特性获取 module/key)
var themeSettings = await _settingsService.GetGlobalSettingAsync<ThemeSettingsDto>();
var userThemeSettings = await _settingsService.GetUserSettingAsync<ThemeSettingsDto>(userId);
var tenantThemeSettings = await _settingsService.GetTenantSettingAsync<ThemeSettingsDto>(tenantId);// 方式一:传统方式(需要手动传入 module 和 key)
await _settingsService.SetGlobalSettingAsync("System", "Theme", "Dark", "更新默认主题");
await _settingsService.SetUserSettingAsync("System", "Theme", "Light", userId, "用户偏好设置");
var config = new AppConfig { /* 配置内容 */ };
await _settingsService.SetGlobalSettingAsync("System", "Configuration", config);
// 方式二:使用 SettingsDto 特性(推荐)
[SettingsDto("System", "Theme")]
publicclassThemeSettingsDto
{
publicstring Theme { get; set; } = "Light";
}
var themeSettings = new ThemeSettingsDto { Theme = "Dark" };
await _settingsService.SetGlobalSettingAsync(themeSettings, "更新默认主题");
await _settingsService.SetTenantSettingAsync(themeSettings, tenantId, "租户主题设置");设置项由以下核心字段组成:
设置范围定义了设置的作用域:
支持多种设置值类型,以适应不同的配置需求:
// 创建设置项定义
var settingItem = new SettingItem
{
Module = "System",
Key = "MaxFileSize",
Name = "最大文件大小",
Description = "上传文件的最大大小限制(MB)",
Value = "10",
ValueType = SettingValueType.Integer,
Scope = SettingScope.Global
};
await _settingsService.CreateOrUpdateSettingDefinitionAsync(settingItem);
// 获取设置项定义
var definition = await _settingsService.GetSettingDefinitionAsync("System", "MaxFileSize");// 获取设置历史记录
var history = await _settingsService.GetSettingHistoryAsync("System", "Theme");租户设置允许为每个租户配置独立的设置值,当租户设置不存在时,会自动继承全局设置。
// 获取租户设置(如果租户设置不存在,返回全局设置)
var tenantTheme = await _settingsService.GetTenantSettingAsync("System", "Theme", tenantId);
// 设置租户设置
await _settingsService.SetTenantSettingAsync("System", "Theme", "Dark", tenantId, "租户主题设置");
// 获取租户所有设置(合并全局设置和租户设置)
var allTenantSettings = await _settingsService.GetAllTenantSettingsAsync("System", tenantId);
// 批量设置租户设置
var settings = new Dictionary<string, string>
{
{ "Theme", "Dark" },
{ "Language", "zh-CN" }
};
await _settingsService.BatchSetTenantSettingsAsync("System", settings, tenantId, "批量更新租户设置");
// 重置租户设置为全局默认值
await _settingsService.ResetTenantSettingToDefaultAsync("System", "Theme", tenantId);租户设置与全局设置的关系:
// 导出设置
var exportData = await _settingsService.ExportSettingsAsync("System");
// 导入设置
await _settingsService.ImportSettingsAsync("System", exportData);// 批量设置全局配置
var settings = new Dictionary<string, string>
{
["Theme"] = "Dark",
["Language"] = "zh-CN",
["TimeZone"] = "Asia/Shanghai"
};
await _settingsService.BatchSetGlobalSettingsAsync("System", settings, "系统初始化");
// 批量设置用户配置
await _settingsService.BatchSetUserSettingsAsync("System", settings, userId, "用户偏好初始化");可以使用Settings扩展方法轻松从设置字典中获取不同类型的值:
// 获取所有设置
var allSettings = await _settingsService.GetAllGlobalSettingsAsync("System");
// 使用扩展方法获取类型化值
int maxSize = allSettings.GetInt("MaxFileSize", 10);
bool isDarkMode = allSettings.GetBool("DarkMode", false);
decimal taxRate = allSettings.GetDecimal("TaxRate", 0.17m);
AppConfig config = allSettings.GetJson<AppConfig>("Configuration");将应用设置按功能模块组织,例如:
System: 系统级配置Security: 安全相关设置UI: 用户界面设置Notification: 通知相关设置对于频繁访问的设置,考虑实现缓存层以提高性能:
// 缓存键格式:{Module}:{Scope}:{ScopeId}:{Key}
var cacheKey = $"Settings:System:Global::{key}";为设置 DTO 添加 [SettingsDto] 特性,可以简化 API 调用并避免模块名/配置键字符串不一致的问题:
// 定义设置 DTO
[SettingsDto("ThirdPartyLogin", "WeChat")]
publicclassWeChatLoginSettingsDto
{
publicstring AppId { get; set; } = string.Empty;
publicstring AppSecret { get; set; } = string.Empty;
publicbool Enabled { get; set; } = false;
}
// 读取设置(无需手动传入 module/key)
var settings = await _settingsService.GetTenantSettingAsync<WeChatLoginSettingsDto>(tenantId);
// 保存设置
await _settingsService.SetTenantSettingAsync(dto, tenantId, "更新微信配置");优势:
如果使用传统方式,为常用设置键定义常量,避免硬编码:
public staticclassSettingKeys
{
publicstaticclassSystem
{
publicconststring Theme = "Theme";
publicconststring Language = "Language";
publicconststring TimeZone = "TimeZone";
}
}// 在控制器中使用
[ApiController]
[Route("api/[controller]")]
publicclassSettingsController : ControllerBase
{
privatereadonly ISettingsService _settingsService;
public SettingsController(ISettingsService settingsService)
{
_settingsService = settingsService;
}
[HttpGet("global/{module}/{key}")]
public async Task<IActionResult> GetGlobalSetting(string module, string key)
{
varvalue = await _settingsService.GetGlobalSettingAsync(module, key);
return Ok(value);
}
[HttpGet("user/{module}/{key}")]
public async Task<IActionResult> GetUserSetting(string module, string key)
{
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
varvalue = await _settingsService.GetUserSettingAsync(module, key, userId);
return Ok(value);
}
}可以利用CodeSpirit.Amis组件自动生成设置管理界面:
// 在Amis页面中添加设置表单
[HttpGet("settings/form")]
public IActionResult GetSettingsForm()
{
var form = new Form
{
Title = "系统设置",
Mode = "horizontal",
Controls = new List<FormControl>
{
new FormControlSwitch { Label = "暗黑模式", Name = "darkMode" },
new FormControlSelect { Label = "语言", Name = "language", Options = new[] { "中文", "英文" } },
new FormControlNumber { Label = "每页显示数", Name = "pageSize", Min = 10, Max = 100 }
}
};
return Ok(form.ToAmisSchema());
}组件提供了全面的API支持各种设置管理操作:
GetGlobalSettingAsync(string module, string key) - 获取全局设置GetGlobalSettingAsync<T>(string module, string key) - 获取类型化全局设置GetGlobalSettingAsync<T>() - 获取类型化全局设置(从 DTO 特性自动获取 module/key,需标记 [SettingsDto])GetAllGlobalSettingsAsync(string module) - 获取模块的所有全局设置SetGlobalSettingAsync(string module, string key, string value, string? reason) - 设置全局设置SetGlobalSettingAsync<T>(string module, string key, T value, string? reason) - 设置类型化全局设置SetGlobalSettingAsync<T>(T value, string? reason) - 设置类型化全局设置(从 DTO 特性自动获取 module/key,需标记 [SettingsDto])BatchSetGlobalSettingsAsync(string module, Dictionary<string, string> settings, string? reason) - 批量设置全局设置GetUserSettingAsync(string module, string key, string userId) - 获取用户设置GetUserSettingAsync<T>(string module, string key, string userId) - 获取类型化用户设置GetUserSettingAsync<T>(string userId) - 获取类型化用户设置(从 DTO 特性自动获取 module/key,需标记 [SettingsDto])GetAllUserSettingsAsync(string module, string userId) - 获取用户的所有设置SetUserSettingAsync(string module, string key, string value, string userId, string? reason) - 设置用户设置SetUserSettingAsync<T>(string module, string key, T value, string userId, string? reason) - 设置类型化用户设置SetUserSettingAsync<T>(T value, string userId, string? reason) - 设置类型化用户设置(从 DTO 特性自动获取 module/key,需标记 [SettingsDto])BatchSetUserSettingsAsync(string module, Dictionary<string, string> settings, string userId, string? reason) - 批量设置用户设置ResetUserSettingToDefaultAsync(string module, string? key, string userId) - 重置用户设置为全局默认值GetTenantSettingAsync(string module, string key, string tenantId) - 获取租户设置GetTenantSettingAsync<T>(string module, string key, string tenantId) - 获取类型化租户设置GetTenantSettingAsync<T>(string tenantId) - 获取类型化租户设置(从 DTO 特性自动获取 module/key,需标记 [SettingsDto])GetAllTenantSettingsAsync(string module, string tenantId) - 获取租户的所有设置SetTenantSettingAsync(string module, string key, string value, string tenantId, string? reason) - 设置租户设置SetTenantSettingAsync<T>(string module, string key, T value, string tenantId, string? reason) - 设置类型化租户设置SetTenantSettingAsync<T>(T value, string tenantId, string? reason) - 设置类型化租户设置(从 DTO 特性自动获取 module/key,需标记 [SettingsDto])BatchSetTenantSettingsAsync(string module, Dictionary<string, string> settings, string tenantId, string? reason) - 批量设置租户设置ResetTenantSettingToDefaultAsync(string module, string? key, string tenantId) - 重置租户设置为全局默认值GetSettingDefinitionAsync(string module, string key) - 获取设置定义GetAllSettingDefinitionsAsync(string module) - 获取模块的所有设置定义CreateOrUpdateSettingDefinitionAsync(SettingItem settingItem) - 创建或更新设置定义DeleteSettingDefinitionAsync(string module, string key) - 删除设置定义GetSettingHistoryAsync(string module, string key) - 获取设置历史ExportSettingsAsync(string module) - 导出设置ImportSettingsAsync(string module, string settingsJson) - 导入设置CodeSpirit.Settings组件提供了一套完整的设置管理解决方案,支持多级设置、类型化访问、版本历史等功能,可以满足各种应用场景下的配置管理需求。通过本组件,开发人员可以方便地实现集中化配置管理,提高应用的可配置性和用户体验。
本文分享自 CodeSpirit-码灵 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!