Nach langem Suchen funktioniert dies (in ASPNetCore 2.2) für den Zugriff auf die Konfiguration appsettings.json aus einer statischen Klasse, aber aus irgendeinem Grund wird appsettings.development.json nicht mehr richtig geladen, aber es könnte etwas anderes in meinem Projekt sein, das das durcheinander bringt. Der reloadOnChange funktioniert. Als Bonus gibt es auch IHostingEnvironment und IHttpContextAccessor. Während dies funktioniert, habe ich mich kürzlich entschlossen, wieder auf einen DI-Ansatz umzusteigen, um dem Paradigmenwechsel zu folgen, wie andere erwähnt haben.
Hier ist eine von vielen Möglichkeiten, auf DI-Inhalte (einschließlich der Konfiguration) in einer statischen Klasse zuzugreifen:
AppServicesHelper.cs:
public static class AppServicesHelper
{
static IServiceProvider services = null;
public static IServiceProvider Services
{
get { return services; }
set
{
if (services != null)
{
throw new Exception("Can't set once a value has already been set.");
}
services = value;
}
}
public static HttpContext HttpContext_Current
{
get
{
IHttpContextAccessor httpContextAccessor = services.GetService(typeof(IHttpContextAccessor)) as IHttpContextAccessor;
return httpContextAccessor?.HttpContext;
}
}
public static IHostingEnvironment HostingEnvironment
{
get
{
return services.GetService(typeof(IHostingEnvironment)) as IHostingEnvironment;
}
}
public static MyAppSettings Config
{
get
{
var s = services.GetService(typeof(IOptionsMonitor<MyAppSettings>)) as IOptionsMonitor<MyAppSettings>;
MyAppSettings config = s.CurrentValue;
return config;
}
}
}
}
Startup.cs:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.Configure<MyAppSettings>(Configuration.GetSection(nameof(MyAppSettings)));
services.AddSingleton(resolver => resolver.GetRequiredService<IOptionsMonitor<MyAppSettings>>().CurrentValue);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
AppServicesHelper.Services = app.ApplicationServices;
}
Regler:
public class MyController: Controller
{
public MyController()
{
}
public MyAppSettings Config => AppServicesHelper.Config;
public async Task<IActionResult> doSomething()
{
testModel tm = await myService.GetModel(Config.Setting_1);
return View(tm);
}
}
Eine andere Klassenbibliothek:
public static class MyLibraryClass
{
public static string GetMySetting_ => AppServicesHelper.Config.Setting_1;
public static bool IsDev => AppServicesHelper.HostingEnvironment.IsDevelopment();
}
MyAppSettings.cs ist eine Klasse, die einem MyAppSettings-Abschnitt in appsettings.json zugeordnet ist:
public class MyAppSettings
{
public string Setting_1 {get;set;}
}
appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"MyAppSettings": {
"Setting_1": "something"
}
}