ASP.NET Core—access Configuration from static class

后端 未结 13 1983
我在风中等你
我在风中等你 2021-02-01 00:27

I want a simple static class that accesses the Configuration object. All the config info is already read in from the appsettings.json file in the Startup class. I just need an e

13条回答
  •  别那么骄傲
    2021-02-01 00:48

    After much research, this works (in ASPNetCore 2.2) for accessing the appsettings.json config from a static class but for some reason appsettings.development.json no longer loads properly but it might be something else in my project messing that up. The reloadOnChange does work. As a bonus it also has IHostingEnvironment and IHttpContextAccessor. While this works, I have recently decided to switch back to a more DI approach to follow the paradigm shift as others have mentioned.

    So here is one of many ways to access some DI stuff (including the configuration) in a static class:

    AppServicesHelper.cs:

    public static class AppServicesHelper
    {
            static IServiceProvider services = null;
    
            /// 
            /// Provides static access to the framework's services provider
            /// 
            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;
                }
            }
    
            /// 
            /// Provides static access to the current HttpContext
            /// 
            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;
                }
            }
    
            /// 
            /// Configuration settings from appsetting.json.
            /// 
            public static MyAppSettings Config
            {
                get
                {
                    //This works to get file changes.
                    var s = services.GetService(typeof(IOptionsMonitor)) as IOptionsMonitor;
                    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();//For HttpContext.
    
            // Register the IOptions object
            services.Configure(Configuration.GetSection(nameof(MyAppSettings)));
    
            //Explicitly register the settings object by delegating to the IOptions object so that it can be accessed globally via AppServicesHelper.
            services.AddSingleton(resolver => resolver.GetRequiredService>().CurrentValue);
     }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
    //...
       AppServicesHelper.Services = app.ApplicationServices;
    //...
    }
    

    Controller:

    public class MyController: Controller
    {
       public MyController()
       {
       }
    
       public MyAppSettings Config => AppServicesHelper.Config;
    
       public async Task doSomething()
       {
                testModel tm = await myService.GetModel(Config.Setting_1);
                return View(tm);
       }
    }
    

    Another class library:

    public static class MyLibraryClass
    {
         public static string GetMySetting_ => AppServicesHelper.Config.Setting_1; 
         public static bool IsDev => AppServicesHelper.HostingEnvironment.IsDevelopment();
    }
    

    MyAppSettings.cs is any class that maps to a MyAppSettings section in appsettings.json:

    public class MyAppSettings
    {
        public string Setting_1 {get;set;}
    }
    

    appsettings.json:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "MyAppSettings": {
          "Setting_1": "something"
       }
     }
    

提交回复
热议问题