首页 > 解决方案 > 如何在控制器或其他类中获取环境变量

问题描述

我有这个自定义的 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;
        }
    }

标签: c#asp.net-core.net-coreconfiguration

解决方案


您必须像这样在控制器中注入IHostingEnvironment接口。contractor

public class HomeController : ControllerBase
{
    private readonly IHostingEnvironment _hostingEnvironment;
    public HomeController(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }
}

然后传递IHostingEnvironmentto 方法

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;
    }


推荐阅读