簡體   English   中英

如何在 controller 或其他類中獲取環境變量

[英]how to get env variable in controller or other classes

我有這個自定義的 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;
            }
        }
    }

從其他地方調用此方法時,例如 controller,如何訪問當前環境?

IConfigurationRoot Config
    {
        get
        {
            if (_config == null)
            {
                _config = ConfigurationService.LoadAppSettings(ENV ?);
            }
            return _config;
        }
    }

您必須像這樣在contractor controller 中注入IHostingEnvironment接口。

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

然后將IHostingEnvironment傳遞給方法

public IActionResult Index()
{
    //test
    _config = ConfigurationService.LoadAppSettings(_hostingEnvironment);
    return Ok();
}

更新

另一種方法是使用IOptions<>

在這種情況下,您必須注冊一個顯示像這樣的環境變量的 class

public class AppSettings
{
    public string Environment { get; set; }
}

ConfigureServices方法中注冊 class 並從CurrentEnvironment.EnvironmentName獲取Environment

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

然后在您的 controller 中注入IOption<AppSettings>而不是IHostingEnvironment並將LoadAppSettings(IHostingEnvironment env)更改為LoadAppSettings(AppSettings appSettings)

Controller

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM