現在、asp.netコアv1.1を使用してプロジェクトに取り組んでおり、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"));
Controllerから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");
}
しかし、それは何もしませんでした。
.Net Core Appsでの設定のセットアップに関するマイクロソフトの関連記事は次のとおりです。
ページには サンプルコード もあり、これも役立つ場合があります。
更新
インメモリプロバイダーとPOCOクラスへのバインド が役に立つかもしれないと思ったが、OPが期待どおりに動作しない。
次のオプションは、 AddJsonFile のreloadOnChange
パラメーターをtrueに設定し、構成ファイルを追加し、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 Core 1.1以降でのみサポートされています。
基本的に、次のようにIConfiguration
の値を設定できます。
IConfiguration configuration = ...
// ...
configuration["key"] = "value";
そこに問題があるのは、例えばJsonConfigurationProvider
は、構成のファイルへの保存を実装しません。 source でわかるように、ConfigurationProvider
のSetメソッドをオーバーライドしません。 ( source を参照)
独自のプロバイダーを作成し、そこに保存を実装できます。 ここ(Entity Frameworkカスタムプロバイダーの基本サンプル) は、その方法の例です。
Appsettings.jsonにeurekaポートがあり、args(-p 5090)で動的に変更したいとします。これを行うことで、多くのサービスを作成するときに、Dockerのポートを簡単に変更できます。
"eureka": {
"client": {
"serviceUrl": "http://10.0.0.101:8761/eureka/",
"shouldRegisterWithEureka": true,
"shouldFetchRegistry": false
},
"instance": {
"port": 5000
}
}
public class Startup
{
public static string port = "5000";
public Startup(IConfiguration configuration)
{
configuration["eureka:instance:port"] = port;
Configuration = configuration;
}
public static void Main(string[] args)
{
int port = 5000;
if (args.Length>1)
{
if (int.TryParse(args[1], out port))
{
Startup.port = port.ToString();
}
}
}