首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET核心-来自静态类的访问配置

ASP.NET核心-来自静态类的访问配置
EN

Stack Overflow用户
提问于 2017-08-26 00:16:23
回答 12查看 76.7K关注 0票数 101

我想要一个访问Configuration对象的简单静态类。所有配置信息都已经从Startup类中的appsettings.json文件中读入。我只需要一个简单的方法来访问它。这个是可能的吗?

代码语言:javascript
复制
namespace MyNamespace
{
    public static class Config
    {
        public string Username => Configuration["Username"];
        public string Password => Configuration["Password"];
    }
}

应用程序中的任何其他位置:

代码语言:javascript
复制
string username = Config.Username;
string password = Config.Password;
EN

回答 12

Stack Overflow用户

发布于 2018-11-07 08:11:14

一个稍短的版本,基于与上面相同的原理……

代码语言:javascript
复制
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
    StaticConfig = configuration;
}

public static IConfiguration StaticConfig { get; private set; }

要在另一个静态类中使用:

代码语言:javascript
复制
string connString = Startup.StaticConfig.GetConnectionString("DefaultConnection");
票数 82
EN

Stack Overflow用户

发布于 2019-04-10 02:03:44

经过大量研究,这个方法(在ASPNetCore 2.2中)可以从静态类访问appsettings.json配置,但由于某种原因,appsettings.development.json不再正确加载,这可能是我的项目中的其他原因造成的。reloadOnChange工作正常。作为奖励,它还拥有IHostingEnvironment和IHttpContextAccessor。虽然这是可行的,但我最近决定切换回更依赖注入的方法,以遵循其他人提到的范式转换。

因此,这里是访问静态类中的一些DI内容(包括配置)的许多方法之一:

AppServicesHelper.cs:

代码语言:javascript
复制
public static class AppServicesHelper
{
        static IServiceProvider services = null;

        /// <summary>
        /// Provides static access to the framework's services provider
        /// </summary>
        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;
            }
        }

        /// <summary>
        /// Provides static access to the current HttpContext
        /// </summary>
        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;
            }
        }

        /// <summary>
        /// Configuration settings from appsetting.json.
        /// </summary>
        public static MyAppSettings Config
        {
            get
            {
                //This works to get file changes.
                var s = services.GetService(typeof(IOptionsMonitor<MyAppSettings>)) as IOptionsMonitor<MyAppSettings>;
                MyAppSettings config = s.CurrentValue;

                return config;
            }
        }
    }
}

Startup.cs:

代码语言:javascript
复制
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<MyAppSettings>(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<IOptionsMonitor<MyAppSettings>>().CurrentValue);
 }

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//...
   AppServicesHelper.Services = app.ApplicationServices;
//...
}

控制器:

代码语言:javascript
复制
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);
   }
}

另一个类库:

代码语言:javascript
复制
public static class MyLibraryClass
{
     public static string GetMySetting_ => AppServicesHelper.Config.Setting_1; 
     public static bool IsDev => AppServicesHelper.HostingEnvironment.IsDevelopment();
}

MyAppSettings.cs是映射到appsettings.json中的MyAppSettings部分的任何类:

代码语言:javascript
复制
public class MyAppSettings
{
    public string Setting_1 {get;set;}
}

appsettings.json:

代码语言:javascript
复制
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "MyAppSettings": {
      "Setting_1": "something"
   }
 }
票数 14
EN

Stack Overflow用户

发布于 2017-09-05 15:37:16

我同意mcbowes,它在docs中,但是第一个例子看起来更像你need...want:

代码语言:javascript
复制
public class Program
{
    public static IConfigurationRoot Configuration { get; set; }
    public static void Main(string[] args = null)
    {
        var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");

        Configuration = builder.Build();

        Console.WriteLine($"option1 = {Configuration["option1"]}");

        // Edit:
        IServiceCollection services = new ServiceCollection();
        services.AddOptions();
        services.Configure<HelloWorldOptions>(_configuration.GetSection("HelloWorld"));
        // And so on...
    }
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45885615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档