как получить переменную env в контроллере или других классах - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть этот пользовательский 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;
            }
        }
    }

При вызове этого метода из других мест, например, контроллера, как я могу получить доступ к текущему env?

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

1 Ответ

1 голос
/ 06 апреля 2020

Вы должны ввести IHostingEnvironment интерфейс в contractor контроллер, как это.

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

, в этом случае вы должны зарегистрировать класс, в котором отображается переменная окружения, как этот

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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...