ASP.NET Core 6+ 如何在启动过程中访问配置

Viv*_*Dev 255 c# asp.net-core .net-6.0 .net-7.0

在早期版本中,我们有 Startup.cs 类,并在Startup文件中获取配置对象,如下所示。

public class Startup 
{
    private readonly IHostEnvironment environment;
    private readonly IConfiguration config;

    public Startup(IConfiguration configuration, IHostEnvironment environment) 
    {
        this.config = configuration;
        this.environment = environment;
    }

    public void ConfigureServices(IServiceCollection services) 
    {
        // Add Services
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
    {
        // Add Middlewares
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,在 .NET 6 及更高版本(使用 Visual Studio 2022)中,我们看不到Startup.cs类。看来它的日子屈指可数了。那么我们如何获取配置(IConfiguration)和托管环境(IHostEnvironment)等对象

我们如何获取这些对象,也就是说从 appsettings 读取配置?目前,Program.cs 文件如下所示。

using Festify.Database;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

builder.Services.AddDbContext<FestifyContext>();


////////////////////////////////////////////////
// The following is Giving me error as Configuration 
// object is not avaible, I dont know how to inject this here.
////////////////////////////////////////////////


builder.Services.AddDbContext<FestifyContext>(opt =>
        opt.UseSqlServer(
            Configuration.GetConnectionString("Festify")));


var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
Run Code Online (Sandbox Code Playgroud)

我想知道如何从 appsettings.json 读取配置?

Gur*_*ron 371

WebApplicationBuilderWebApplication.CreateBuilder(args)由暴露ConfigurationEnvironment属性返回:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
...
ConfigurationManager configuration = builder.Configuration; // allows both to access and to set up the config
IWebHostEnvironment environment = builder.Environment;
Run Code Online (Sandbox Code Playgroud)

WebApplication返回的WebApplicationBuilder.Build()还公开了ConfigurationEnvironment

var app = builder.Build();
IConfiguration configuration = app.Configuration;
IWebHostEnvironment environment = app.Environment;
Run Code Online (Sandbox Code Playgroud)

另请查看迁移指南代码示例

适用于

  • 如果它不是网络应用程序怎么办? (3认同)
  • 在早期版本中,我们可以通过Configure()方法上的依赖注入来访问IHttpContextAccessor。在.NET 6中,我们如何访问Program.cs中的HttpContextAccessor? (2认同)

Jam*_*ruk 45

在 中Program.cs,创建了 WebApplicationBuilder,如下所示。

var builder = WebApplication.CreateBuilder(args);
Run Code Online (Sandbox Code Playgroud)

一旦我们创建了构建器,配置就可用了。

假设您已appSettings.json设置默认值。下面的示例代码将从 JSON 配置文件返回配置默认日志级别设置。

builder.Configuration["Logging:LogLevel:Default"] // returns "Warning"
Run Code Online (Sandbox Code Playgroud)

应用程序运行后,您可以通过应用程序的其他类中的依赖项注入来访问配置设置。

public MyClass(IConfiguration configuration)
{
   var logLevel = configuration["Logging:LogLevel:Default"];
}
Run Code Online (Sandbox Code Playgroud)

这是一个值得考虑的好功能,它可以创建一个代表您的设置的类,然后将配置绑定到该类类型的实例。例如,假设您创建一个名为 的新类,其MyAppSettings结构与您的 相同appSettings.json,您可以执行以下操作:

var myAppSettings = builder.Configuration.Get<MyAppSettings>();
string logLevel = myAppSettings.Logging.LogLevel.Default;
Run Code Online (Sandbox Code Playgroud)


小智 15

.NET 6 已经在 Program.cs 中提供了构建器对象

var builder = WebApplication.CreateBuilder(args);
Run Code Online (Sandbox Code Playgroud)

只需使用此构建器访问配置和环境作为示例,即可从 app.settings.cs 获取 ConnectionString,如下所示:

builder.Services.AddDbContext<DataContext>( options =>
{
  options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnectiion"));
});
Run Code Online (Sandbox Code Playgroud)


Bud*_*hiP 15

我知道这个问题最初是问的,ASPNetCore但如果您碰巧希望为工人服务做同样的事情,并且像我一样来到这里,希望这个答案对您有所帮助。

Worker Service 使用IHostBuilder代替IWebApplicationBuilder,并且不会公开 Configuration 属性,但您可以将 IHostBuilderContext 的实例接受到ConfigureServices 方法中,该方法会公开 Configuration 实例。

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((context, services) =>
    {
         var settings = context.Configuration.Get<Settings>();
    })
    .Build();
Run Code Online (Sandbox Code Playgroud)


小智 14

//.NET6 Program.cs -(获取应用程序配置属性)

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
builder.Configuration.AddJsonFile($"appsettings.Dev.json", optional: true);
builder.Configuration.AddEnvironmentVariables();

// projectwide instances
  public IConfiguration _configuration;
        public AccountsAPIController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

// _configuration.GetConnectionString("DefaultConnection");
Run Code Online (Sandbox Code Playgroud)

  • 此问题有**六个现有答案**,其中包括一个投票最高、已接受的答案,其票数远远超过**一百票**。您_确定_尚未给出您的解决方案吗?如果不是,为什么您认为您的方法改进了已得到社区验证的现有提案?提供解释在 Stack Overflow 上_总是_有用,但当问题得到解决以使 OP 和社区都满意时,这一点_尤其_重要_。通过解释你的答案有何不同以及何时可能更受欢迎来帮助读者。 (11认同)
  • 我相信这应该是建议的答案,因为它清楚地显示了如何加载额外的 json 文件(和环境变量,但这是默认完成的)。 (2认同)

小智 7

您所需要的只是添加“构建器”。在您的配置之前

喜欢:

builder.Services
       .AddDbContext<FestifyContext>
    (opt =>opt.UseSqlServer(builder.Configuration
                                   .GetConnectionString("Festify")));

Run Code Online (Sandbox Code Playgroud)


sin*_*lla 7

这对我有用——

// Read in from JSON file
builder.Services.Configure<ConnectionKeys>(builder.Configuration.GetSection("ConnectionKeys"));
Run Code Online (Sandbox Code Playgroud)