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

如何在其他类中获取当前使用的appsettings.json文件路径

解决方案

方法一:提前收集配置文件路径并注入

在构建IConfiguration完成后,提取已加载的JSON配置文件路径,将其注册为服务供MyService使用:

// 构建配置
IConfiguration configuration = new ConfigurationBuilder()
    .SetBasePath("/home/pi/config/")
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT") ?? "Production"}.json", true, true)
    .AddEnvironmentVariables()
    .Build();

// 提取已加载的JSON配置文件完整路径
var loadedConfigFiles = ((IConfigurationRoot)configuration).Sources
    .OfType<JsonConfigurationSource>()
    .Select(source => 
    {
        var physicalProvider = source.FileProvider as PhysicalFileProvider;
        var basePath = physicalProvider?.Root ?? "/home/pi/config/";
        return Path.Combine(basePath, source.Path);
    })
    .Where(filePath => File.Exists(filePath)) // 只保留实际存在的文件
    .ToList();

// 注册路径集合为单例服务
services.AddSingleton(loadedConfigFiles);

在MyService中注入并使用:

public class MyService : IMyService
{
    private readonly List<string> _loadedConfigFiles;

    public MyService(List<string> loadedConfigFiles)
    {
        _loadedConfigFiles = loadedConfigFiles;
    }

    public void PrintConfigFiles()
    {
        foreach (var filePath in _loadedConfigFiles)
        {
            Console.WriteLine($"已加载的配置文件:{filePath}");
        }
    }
}

方法二:在MyService中直接从IConfigurationRoot提取

IConfiguration的实际实现是IConfigurationRoot,它包含Sources属性可访问配置源信息。直接在MyService中转换类型并提取:

public class MyService : IMyService
{
    private readonly IConfigurationRoot _configRoot;

    public MyService(IConfiguration configuration)
    {
        // 将IConfiguration转换为IConfigurationRoot
        _configRoot = (IConfigurationRoot)configuration;
    }

    public void GetLoadedConfigFiles()
    {
        var configFiles = _configRoot.Sources
            .OfType<JsonConfigurationSource>()
            .Select(source => 
            {
                var physicalProvider = source.FileProvider as PhysicalFileProvider;
                var basePath = physicalProvider?.Root ?? "/home/pi/config/";
                return Path.Combine(basePath, source.Path);
            })
            .Where(filePath => File.Exists(filePath))
            .ToList();

        foreach (var filePath in configFiles)
        {
            Console.WriteLine($"配置文件路径:{filePath}");
        }
    }
}

关键说明

  • IConfiguration接口本身不暴露配置源的细节,必须转换为IConfigurationRoot才能访问Sources集合。
  • 对于JsonConfigurationSource,通过FileProvider获取配置文件的根路径,结合Path属性得到完整文件路径。
  • 由于第二个AddJsonFile设置了optional: true,需要过滤掉不存在的文件,避免输出无效路径。

内容的提问来源于stack exchange,提问作者Kris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:55:16