繁体   English   中英

如何使用.Net 5 Core在其他类中全局访问appsettings.json

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM