如何实现应用配置的保存?基于Microsoft内置DI的技术疑问
如何将修改后的配置保存回appsettings.json文件
.NET内置的IConfiguration仅支持配置读取,没有内置的保存机制。针对你需要将修改后的OptionsModel保存回appsettings12.json的需求,可通过以下步骤实现:
1. 定义配置写入服务接口
先抽象配置保存的操作逻辑,便于后续扩展和维护:
public interface IConfigurationWriter { Task SaveOptionsAsync(OptionsModel updatedOptions); }
2. 实现JSON配置写入服务
通过JSON处理库(以Newtonsoft.Json为例)读取配置文件、更新指定节点并写回文件:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System.IO; using System.Threading.Tasks; public class JsonConfigurationWriter : IConfigurationWriter { private readonly string _configFilePath; private readonly IConfigurationRoot _configurationRoot; public JsonConfigurationWriter(IConfigurationRoot configurationRoot, IHostEnvironment environment) { _configurationRoot = configurationRoot; // 获取配置文件的完整路径 _configFilePath = Path.Combine(environment.ContentRootPath, "appsettings12.json"); } public async Task SaveOptionsAsync(OptionsModel updatedOptions) { // 读取现有JSON内容 var jsonContent = await File.ReadAllTextAsync(_configFilePath); var configJson = JObject.Parse(jsonContent); // 更新"Options"节点数据 var optionsSection = configJson["Options"]; if (optionsSection != null) { var updatedOptionsJson = JObject.FromObject(updatedOptions); configJson["Options"] = updatedOptionsJson; } // 将更新后的JSON格式化后写回文件 await File.WriteAllTextAsync(_configFilePath, configJson.ToString(Formatting.Indented)); // 重新加载配置,确保后续读取能获取最新值 _configurationRoot.Reload(); } }
3. 在DI容器中注册服务
修改你的ConfigureHost方法,添加配置写入服务的注册:
public static IHostBuilder ConfigureHost(this IHostBuilder builder) { IConfigurationRoot? configRoot = null; _ = builder.ConfigureAppConfiguration((context, config) => { configRoot = config.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings12.json") .Build(); }); _ = builder.ConfigureServices((context, services) => services.Configure<OptionsModel>(context.Configuration.GetSection("Options")) .AddSingleton<IOptionsService, OptionsService>() .AddSingleton<MainWindowModelView>() .AddSingleton<MainWindow>() // 注册配置写入相关服务 .AddSingleton<IConfigurationRoot>(configRoot!) .AddSingleton<IConfigurationWriter, JsonConfigurationWriter>() ); return builder; }
4. 在业务逻辑中调用保存方法
在你的OptionsService中注入IConfigurationWriter,实现配置修改后的保存逻辑:
public class OptionsService : IOptionsService { private readonly IConfigurationWriter _configWriter; public OptionsService(IConfigurationWriter configWriter) { _configWriter = configWriter; } // 示例:接收修改后的配置并保存 public async Task SaveUpdatedOptionsAsync(OptionsModel updatedOptions) { // 可在此添加配置验证逻辑 await _configWriter.SaveOptionsAsync(updatedOptions); } }
之后在你的修改表单ViewModel中,调用OptionsService的保存方法即可完成配置的持久化。
关键注意事项
- 若使用
System.Text.Json替代Newtonsoft.Json,需调整JSON解析和序列化的代码,核心逻辑保持一致。 - 确保应用程序对
appsettings12.json文件拥有写入权限,生产环境需格外注意文件权限配置。 - 多线程并发修改场景下,需添加锁机制避免文件写入冲突。
内容的提问来源于stack exchange,提问作者vso
相关产品推荐
相关产品推荐

