You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现应用配置的保存?基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:50:51