[英]How to access appsettings.json globally in other classes using .Net 5 Core
我需要访问我项目中其他非控制器类中的 appsettings.json 配置。 有没有一种好方法可以让 IConfiguration 在我的应用程序中全局可用而无需使用 DI? 如果 IConfiguration DI 可用于非控制器类,我想知道如何做到这一点。
这是我的 controller,其中 HostService 可以访问 IConfiguration 注入。
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<HostService>();
}).UseSerilog();
}
我需要访问此非控制器 class 中的 IConfiguration。 我不确定如何使用带有非控制器类型类的 DI,因此使用 static 类型的配置变量可能是使 IConfiguration 全局可用的更好解决方案。
public class myTestClass
{
private readonly IConfiguration _config
public myTestClass(IConfiguration config){ _config = config}
}
您可以通过向主机添加配置处理来向 DI 容器添加配置:
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostContext, config) =>
{
config.AddJsonFile("appsettings.json", false, false);
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<HostService>();
})
.UseSerilog();
}
它使整个IConfiguration
object 可用于您的应用程序:
public class TestOptions
{
public string Data { get; set; }
}
public class HostService : BackgroundService
{
private readonly IConfiguration _configuration;
public HostService(IConfiguration config)
{
_configuration = config;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
// TODO: write your code here
}
}
我需要访问此自定义 class 中的 IConfiguration。 我可以从 HostService class 传递一个 IConfiguration 实例,但正在寻找全局解决方案以避免将实例传递给其他类。
依赖注入解决了很多不同的问题,现在它是开发软件的常用方法。 使用 DI 而不是避免使用它要容易得多。
实际上,我想出了一种方法来使 IConfiguration 在整个应用程序中可用,而无需使用注入。 将 IConfiguration DI 用于非控制器类是毫无意义的,因为它需要太多步骤。 Just create a static class w/ a static IConfiguration variable and assign the Iconfiguration injection parameter to it from the main controller class and it'll be available throughout the app. 这很简单。
程序.cs
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<HostService>();
}).UseSerilog();
}
主机服务.cs
public static class AppData
{
public static IConfiguration Config;
}
public class HostService : IHostedService, IDisposable
{
public HostSyncService(IConfiguration config)
{
AppData.Config = config;
var key= new myTestClass().getKey();
}
}
我的TestClass.cs
public class myTestClass {
public myTestClass(){}
public void getKey(){
// Non-Controller class has access to AppData.Config w/o injection
var key= AppData.Config.GetValue<string>("appSettings:key");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.