c# - 如何在控制器或其他类中获取环境变量
问题描述
我有这个自定义的 ConfigurationService,一切正常,但我现在需要加载基于 env 的设置。所以要做到这一点,我有这个方法LoadAppSettings
public class ConfigurationService : IConfigurationService
{
public IConfigurationRoot LoadAppSettings(IHostingEnvironment env)
{
try
{
var config = new ConfigurationBuilder()
.SetBasePath(_basePath)
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) //for azure functions
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables()
.Build();
return config;
}
catch (System.IO.FileNotFoundException)
{
return null;
}
}
}
从其他地方(如控制器)调用此方法时,如何访问当前环境?
IConfigurationRoot Config
{
get
{
if (_config == null)
{
_config = ConfigurationService.LoadAppSettings(ENV ?);
}
return _config;
}
}
解决方案
您必须像这样在控制器中注入IHostingEnvironment
接口。contractor
public class HomeController : ControllerBase
{
private readonly IHostingEnvironment _hostingEnvironment;
public HomeController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
}
然后传递IHostingEnvironment
to 方法
public IActionResult Index()
{
//test
_config = ConfigurationService.LoadAppSettings(_hostingEnvironment);
return Ok();
}
更新
另一种方法是使用IOptions<>
在这种情况下,您必须注册一个显示像这样的环境变量的类
public class AppSettings
{
public string Environment { get; set; }
}
ConfigureServices
在方法中注册类并从中Environment
获取CurrentEnvironment.EnvironmentName
public IConfiguration Configuration { get; }
private Microsoft.AspNetCore.Hosting.IHostingEnvironment CurrentEnvironment { get; set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
Configuration = configuration;
CurrentEnvironment = env;
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(a => new AppSettings { Environment = CurrentEnvironment.EnvironmentName });
}
然后在您的控制器中注入IOption<AppSettings>
而不是IHostingEnvironment
更改LoadAppSettings(IHostingEnvironment env)
为LoadAppSettings(AppSettings appSettings)
控制器
public class HomeController : ControllerBase
{
private readonly AppSettings _appSettings;
public HomeController(IOptions<AppSettings> options)
{
_appSettings = options.Value;
}
}
行动
public IActionResult Index()
{
//test
_config = ConfigurationService.LoadAppSettings(_appSettings);
return Ok();
}
最后将 LoadAppSettings
方法更改为此
public IConfigurationRoot LoadAppSettings(AppSettings env)
{
try
{
var config = new ConfigurationBuilder()
.SetBasePath(_basePath)
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) //for azure functions
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables()
.Build();
return config;
}
catch (System.IO.FileNotFoundException)
{
return null;
}
推荐阅读
- java - 如何将 HashMap 转换为具有特定格式的字符串?(JAVA)
- blockchain - 入驻是什么意思?
- spring - Spring如何重用关系上的规范
- java - 获取不受支持的字段:在 Java Spring Boot 中使用 DateTimeFormatter 时的 DayOfMonth
- python - numpy数组中所有元素的范围
- python - 在 tkinter 中删除特定的小部件
- javascript - Next.js:优化 LCP 时间/速度
- html - 如何更改 2x2 网格中 div 的顺序
- javascript - 如何模拟返回图像缓冲区的 axios 调用
- angular - 如何存储不同域的cookie