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

And*_*nea 18 configuration app-config startup sections asp.net-core

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

问题是,基于新的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));
}
Run Code Online (Sandbox Code Playgroud)

我需要实际阅读该部分并决定注册的内容ISomething(可能与其他类型不同ConcreteSomething).

Dmi*_*lov 28

这是您可以从方法中获取键入设置appSettings.jsonConfigureServices方法:

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;

        // ...
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)


Set*_*Set 10

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

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);
    })
Run Code Online (Sandbox Code Playgroud)

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

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 在IIS下托管ASP.NET Core 2.1应用程序时,这是如何工作的?不会使用`WebHostBuilder`,那么`IConfiguration配置'中传递给`Startup`的构造函数是什么? (3认同)

小智 5

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

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"]));
    }
}

Run Code Online (Sandbox Code Playgroud)

应用程序设置.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;"
  }
}

Run Code Online (Sandbox Code Playgroud)

  • 不,对象 Configuration 为 null (2认同)