【问题标题】:ASP.NET Core 6 how to access Configuration during startupASP.NET Core 6 如何在启动期间访问配置
【发布时间】: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 中读取配置?

【问题讨论】:

    标签: c# asp.net-core .net-6.0


    【解决方案1】:

    WebApplication.CreateBuilder(args) 返回的WebApplicationBuilder 暴露了ConfigurationEnvironment 属性:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    ...
    ConfigurationManager configuration = builder.Configuration;
    IWebHostEnvironment environment = builder.Environment;
    

    WebApplicationBuilder.Build() 返回的WebApplication 也暴露了ConfigurationEnvironment

    var app = builder.Build();
    IConfiguration configuration = app.Configuration;
    IWebHostEnvironment environment = app.Environment;
    

    还要检查migration guidecode 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"));
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-03-23
            • 1970-01-01
            • 2022-07-19
            • 1970-01-01
            • 2019-12-09
            相关资源
            最近更新 更多