如何在其他类中获取当前使用的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
相关产品推荐
相关产品推荐

