【问题标题】:Actually read AppSettings in ConfigureServices phase in ASP.NET Core在 ASP.NET Core 的 ConfigureServices 阶段实际读取 AppSettings
【发布时间】: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 不同)。

【问题讨论】:

标签: configuration asp.net-core app-config startup sections


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 2015-10-05
        • 2022-11-24
        • 2018-06-20
        相关资源
        最近更新 更多