2017-01-14 2 views
7

я в настоящее время работаю над проектом с использованием ядра asp.net v1.1, и в моем appsettings.json у меня есть:ASP.N Co appsettings.json обновления в коде

"AppSettings": { 
    "AzureConnectionKey": "***", 
    "AzureContainerName": "**", 
    "NumberOfTicks": 621355968000000000, 
    "NumberOfMiliseconds": 10000, 
    "SelectedPvInstalationIds": [ 13, 137, 126, 121, 68, 29 ], 
    "MaxPvPower": 160, 
    "MaxWindPower": 5745.35 
}, 

У меня есть класс, который я использовать для их хранения:

public class AppSettings 
{ 
    public string AzureConnectionKey { get; set; } 
    public string AzureContainerName { get; set; } 
    public long NumberOfTicks { get; set; } 
    public long NumberOfMiliseconds { get; set; } 
    public int[] SelectedPvInstalationIds { get; set; } 
    public decimal MaxPvPower { get; set; } 
    public decimal MaxWindPower { get; set; } 
} 

и возможность использовать затем в Startup.cs DI:

services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); 

Является й как любой способ изменить и сохранить MaxPvPower и MaxWindPower от контроллера?

Я попытался с помощью

private readonly AppSettings _settings; 

public HomeController(IOptions<AppSettings> settings) 
{ 
    _settings = settings.Value; 
} 

[Authorize(Policy = "AdminPolicy")] 
public IActionResult UpdateSettings(decimal pv, decimal wind) 
{ 
    _settings.MaxPvPower = pv; 
    _settings.MaxWindPower = wind; 

    return Redirect("Settings"); 
} 

Но это ничего не сделал.

+0

Непонятно, что вы подразумеваете под «изменением и сохранением». Вы хотите «сохранить» 1. обновить appsettings.json или 2. сохранить только свое представление в памяти. –

+0

Вариант № 1, сэр. То, что мне удалось сделать, это переместить эти два параметра в другой файл - installationettings.json, зарегистрировать их с помощью reloadOnChange в классе Startup и при обновлении - изменить файл, как @Ankit, предложенный ранее сегодня. – Siemko

+0

Siemko, так как вы обновили файл настройки json? Вы использовали структуру конфигурации или вы открыли файл для его редактирования? – Manuel

ответ

5

Вот соответствующая статья от Microsoft о настройке конфигурации в .Net Основные приложения:

Asp.Net Core Configuration

На этой странице также есть sample code, которые также могут быть полезны.

Update

Я думал In-memory provider and binding to a POCO class может быть полезной, но не работает, как ожидается, ОП.

Следующая опция может быть установка reloadOnChange параметр AddJsonFile истина при добавлении файла конфигурации и вручную разборе файла конфигурации в формате JSON и внесение изменений, как предполагалось.

public class Startup 
    { 
     ... 
     public Startup(IHostingEnvironment env) 
     { 
      var builder = new ConfigurationBuilder() 
       .SetBasePath(env.ContentRootPath) 
       .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
       .AddEnvironmentVariables(); 
      Configuration = builder.Build(); 
     } 
     ... 
    } 

... reloadOnChange поддерживается только в ASP.NET Ядра 1.1 и выше.

+0

Спасибо @Ankit за ваш ответ! Это работает отлично, но только в классе Startup я не могу получить доступ к объекту Configuration от Controller, чтобы использовать его для изменения файлов конфигурации. И мне нужны две переменные, которые будут действовать как глобальная статика и будут доступны путем встраивания зависимостей, но также могут изменяться с контроллера. – Siemko

+1

@Siemko ok, я думаю, вы можете попытаться разобрать файл конфигурации самостоятельно и изменить значения напрямую и сохранить 'reloadOnChange' значение' true' в 'startup.cs'. – Ankit

+0

Еще раз спасибо, это то, чего я хотел избежать, но если нет другого пути, я должен попробовать это. – Siemko

5

В принципе вы можете установить значение в IConfiguration так:

IConfiguration configuration = ... 
// ... 
configuration["key"] = "value"; 

Проблемы есть в том, что, например, JsonConfigurationProvider не реализует сохранение конфигурации в файл. Как вы можете видеть в source, он не отменяет метод Set ConfigurationProvider. (см. source)

Вы можете создать своего собственного провайдера и осуществить сохранение там. Here (Basic sample of Entity Framework custom provider) - пример, как это сделать.

Смежные вопросы