ASP.NET Core 6 如何在启动期间访问配置
Posted
技术标签:
【中文标题】ASP.NET Core 6 如何在启动期间访问配置【英文标题】:ASP.NET Core 6 how to access Configuration during startup 【发布时间】:2021-10-26 12:10:04 【问题描述】:在早期版本中,我们有 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
现在在 .NET 6(使用 Visual Studio 2022)中,我们看不到 Startup.cs 类。看起来它的日子已经屈指可数了。那么我们如何获取Configuration(IConfiguration)和Hosting Environment(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();
我想知道如何从 appsettings.json 中读取配置?
【问题讨论】:
【参考方案1】:WebApplication.CreateBuilder(args)
返回的WebApplicationBuilder
暴露了Configuration
和Environment
属性:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
...
ConfigurationManager configuration = builder.Configuration;
IWebHostEnvironment environment = builder.Environment;
WebApplicationBuilder.Build()
返回的WebApplication
也暴露了Configuration
和Environment
:
var app = builder.Build();
IConfiguration configuration = app.Configuration;
IWebHostEnvironment environment = app.Environment;
还要检查migration guide 和code samples。
【讨论】:
在早期版本中,我们可以通过 Configure() 方法的依赖注入来访问 IHttpContextAccessor。在 .NET 6 中,我们如何访问 Program.cs 中的 HttpContextAccessor? 啊,谢谢,我在这些最小的课程上浪费了很多时间。但它现在到了那里。【参考方案2】:在Program.cs
中,WebApplicationBuilder 创建如下所示。
var builder = WebApplication.CreateBuilder(args);
一旦我们创建了构建器,配置就可用了。
假设您有默认的appSettings.json
。下面的示例代码将从 JSON 配置文件返回配置默认日志级别设置。
builder.Configuration["Logging:LogLevel:Default"] // returns "Warning"
应用运行后,您可以在应用的其他类中通过依赖注入访问配置设置。
public MyClass(IConfiguration configuration)
var logLevel = configuration["Logging:LogLevel:Default"];
一个值得考虑的好功能是创建一个代表您的设置的类,然后将配置绑定到该类类型的实例。例如,假设您创建了一个名为 MyAppSettings
的新类,其结构与您的 appSettings.json
相同,您可以执行以下操作:
var myAppSettings = builder.Configuration.Get<MyAppSettings>();
string logLevel = myAppSettings.Logging.LogLevel.Default;
【讨论】:
【参考方案3】:您只需要添加“builder”。在您的配置之前
喜欢:
builder.Services.AddDbContext<FestifyContext>(opt =>opt.UseSqlServer(builder.Configuration.GetConnectionString("Festify")));
【讨论】:
【参考方案4】:以下代码对我有用:
程序.cs:
var builder = WebApplication.CreateBuilder(args);
string connString = builder.Configuration.GetConnectionString("conStr");
ConnectionString = connString;
...
partial class Program
public static string? ConnectionString get; private set;
calling class:
string cnStr = Program.ConnectionString;
【讨论】:
这非常有效!我没想过要使用这样的部分类。这不是“正确”的方式,但是直到有人发布了一个简单的解决方案,比如一个该死的连接字符串(对于我们所有人都没有使用 EF,它存在安全漏洞和性能不佳)。【参考方案5】:这对我有用 ---
// Read in from JSON file
builder.Services.Configure<ConnectionKeys>(builder.Configuration.GetSection("ConnectionKeys"));
【讨论】:
【参考方案6】:.NET 6 已经在 Program.cs 中提供了构建器对象
var builder = WebApplication.CreateBuilder(args);
以该builder访问配置和Environment为例,从app.settings.cs获取ConnectionString如下:
builder.Services.AddDbContext<DataContext>( options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnectiion"));
);
【讨论】:
以上是关于ASP.NET Core 6 如何在启动期间访问配置的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Asp.NET Core 3.1 启动类访问 launchSettings.json 中的 `applicationUrl` 属性?
ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本
ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本 #yyds干货盘点#