在 ASP.NET Core 的 ConfigureServices 阶段实际读取 AppSettings

Posted

技术标签:

【中文标题】在 ASP.NET Core 的 ConfigureServices 阶段实际读取 AppSettings【英文标题】:Actually read AppSettings in ConfigureServices phase in ASP.NET Core 【发布时间】:2017-03-21 02:44:03 【问题描述】:

我需要在 ASP.NET Core 1.0 Web 应用程序的 ConfigureServices 方法中设置一些依赖项(服务)。

问题是基于新的 JSON 配置,我需要设置一个服务或其他服务。

我似乎无法真正阅读应用程序生命周期的ConfigureServices 阶段的设置:

public void ConfigureServices(IServiceCollection services)

    var section = Configuration.GetSection("MySettings"); // this does not actually hold the settings
    services.Configure<MySettingsClass>(section); // this is a setup instruction, I can't actually get a MySettingsClass instance with the settings
    // ...
    // set up services
    services.AddSingleton(typeof(ISomething), typeof(ConcreteSomething));

我需要真正阅读该部分并决定注册ISomething 的内容(可能与ConcreteSomething 不同)。

【问题讨论】:

见***.com/q/40397648/5426333 @ademcaglin:谢谢!就是这样。我投票结束我自己的问题作为那个问题的副本:) 链接的答案是从配置文件中获取值,而不是从 appsettings.json 文件中获取值。 ASP.NET Core Configuration Section in Startup的可能重复 【参考方案1】:

这就是您可以在ConfigureServices 方法中从appSettings.json 获取键入设置的方式:

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 

    public void ConfigureServices(IServiceCollection services)
    
        services.Configure<MySettings>(Configuration.GetSection(nameof(MySettings)));
        services.AddSingleton(Configuration);

        // ...

        var settings = Configuration.GetSection(nameof(MySettings)).Get<MySettings>();
        int maxNumberOfSomething = settings.MaxNumberOfSomething;

        // ...
    

    // ...

【讨论】:

【参考方案2】:

从 ASP.NET Core 2.0 开始,我们在构建 WebHost 实例时在 Program 类中进行配置设置。此类设置示例:

return new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureAppConfiguration((builderContext, config) =>
    
        IHostingEnvironment env = builderContext.HostingEnvironment;

        config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.env.EnvironmentName.json", optional: true, reloadOnChange: true);
    )

其中,这允许直接在Startup 类中使用配置,通过构造函数注入获取IConfiguration 的实例(谢谢,内置 DI 容器):

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 

    ...

【讨论】:

是的!为我工作。最后我可以从 json 条目中获取我的东西来准备我的服务:\ 在 IIS 下托管 ASP.NET Core 2.1 应用程序时如何工作? WebHostBuilder 不会被使用,那么传递给Startup 的构造函数的IConfiguration configuration 是什么?【参考方案3】:

您可以通过Configuration["ConfigSection:ConfigValue"]) 访问 appsettings.json 值

public class Startup

    public Startup(IConfiguration configuration)
    
        Configuration = configuration;
    

    public IConfiguration Configuration  get; 

    public void ConfigureServices(IServiceCollection services)
    
        services.AddDbContext<MyContext>(o => 
            o.UseSqlServer(Configuration["AppSettings:SqlConn"]));
    


appsettings.json


  "Logging": 
    "LogLevel": 
      "Default": "Warning",
      "System": "Information",
      "Microsoft": "Warning"
    
  ,
  "AppSettings": 
    "SqlConn": "Data Source=MyServer\\MyInstance;Initial Catalog=MyDb;User ID=sa;Password=password;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;"
  


【讨论】:

不,对象配置为空【参考方案4】:

appsettings.json 文件:

  "MyApp": 
    "Jwt": 
      "JwtSecretConfigKey": "jwtSecretConfigKey",
      "Issuer": "appIssuer",
      "Audience": "appAudience",
      "ExpireMinutes": 60
    
  

添加一个类来绑定“MyApp”的Jwt部分 ...

   public class JwtConfig
    
        public string JwtSecretConfigKey  get; set; 
        public string Issuer  get; set; 
        public string Audience  get; set; 
        public int ExpireMinutes  get; set; 
    

ConfigureServices 方法中:

//reading config from appsettings.json
var jwtConfig = Configuration.GetSection("MyApp:Jwt").Get<JwtConfig>();

//using config data ....
services.AddJwt(new AddJwtOptions(jwtConfig.JwtSecretConfigKey, jwtConfig.Issuer, jwtConfig.Audience, jwtConfig.ExpireMinutes));

下面的代码和上面的一样。它也有效...

var jwtConfig = Configuration.GetSection("MyApp").GetSection("Jwt").Get<JwtConfig>();

希望这会有所帮助..

【讨论】:

【参考方案5】:

尝试下一个:

var settings = new MySettings();
Configuration.GetSection(nameof(MySettings)).Bind(settings);

【讨论】:

以上是关于在 ASP.NET Core 的 ConfigureServices 阶段实际读取 AppSettings的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core学习笔记 第一篇 ASP.NET Core初探

ASP.NET Core与ASP.NET区别

ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存

ASP.NET Core 1.0 部署 HTTPS

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用AutoMapper进行实体映射