簡體   English   中英

ASP.NET Core 6啟動時如何訪問Configuration

[英]ASP.NET Core 6 how to access Configuration during startup

在早期版本中,我們有 Startup.cs class,我們在Startup文件中得到配置 object,如下所示。

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 class。看起來它的日子已經屈指可數了。 那么我們如何獲得這些對象,如 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 讀取配置?

WebApplicationBuilder WebApplication.CreateBuilder(args)返回的 WebApplicationBuilder 公開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;

WebApplication WebApplicationBuilder.Build()返回的 WebApplication 還公開了ConfigurationEnvironment

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

還要檢查遷移指南代碼示例

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;

.NET 6 已經在 Program.cs 中提供了構建器對象

var builder = WebApplication.CreateBuilder(args);

只需使用此構建器訪問配置和環境作為示例,即可從 app.settings.cs 中獲取 ConnectionString,如下所示:

builder.Services.AddDbContext<DataContext>( options =>
{
  options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnectiion"));
});

您只需要添加“構建器”即可。 在您的配置之前

喜歡:

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

以下代碼對我有用:

程序.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;

這對我有用---

// Read in from JSON file
builder.Services.Configure<ConnectionKeys>(builder.Configuration.GetSection("ConnectionKeys"));

這與之前的答案略有不同,我將其包括在內,因為我正在審查類似的內容。

在您的Program.cs中,您還可以將代碼分組到一個方法中並調用它以使其運行較少或對類似的事物進行分組。 我不會把所有的代碼都放進去; 我不會在此處列出using指令的完整列表,但足以演示該技術,並且我將省略一些方法代碼。 對於您的解決方案來說,這還不夠,甚至可能太多,需要您的自定義修飾。

using AutoMapper;
using MicroKnights.Log4NetHelper;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
...
//all your using directives
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

//a variable to hold configuration
IConfiguration Configuration;

var builder = WebApplication.CreateBuilder(args);
Configuration = builder.Configuration;

// call some methods
ConfigureAuth(builder.Services);
ConfigureRedis(builder.Services);
ConfigureSession(builder.Services);
ConfigureMvc(builder.Services);
ConfigureServices(builder.Services);

var app = builder.Build();
ConfigureMiddleWare(app);
app.Run();
// we are done with the main part, now the methods

void ConfigureMvc(IServiceCollection services)
{
    builder.Services.AddMvc(config =>
    {
        var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
        config.Filters.Add(new AuthorizeFilter(policy));
    })
    .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/Home/Login", ""); })
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
        options.JsonSerializerOptions.PropertyNamingPolicy = null;
    });
}

void ConfigureSession(IServiceCollection services)
{
    builder.Services.AddSession(options =>
    {
        options.Cookie.Name = "mygreatsite_session";
        options.IdleTimeout = TimeSpan.FromMinutes(60);
    });
}

void ConfigureRedis(IServiceCollection services)
{
    var redisConfig = new RedisOptions();
    Configuration.GetSection(RedisOptions.RedisConfig).Bind(redisConfig);
    services.AddStackExchangeRedisCache(options =>
    {
        options.Configuration = redisConfig.ConnectionString;
        options.InstanceName = "mygreatsite_";
    });
    services.AddDataProtection()
        .SetApplicationName("MyGreatSite.Website")
        .PersistKeysToStackExchangeRedis(ConnectionMultiplexer.Connect(redisConfig.ConnectionString), "DataProtection-Keys");
}

void ConfigureMiddleWare(WebApplication app)
{
    if (builder.Environment.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseRouting();
    app.UseCors("default");
    app.UseCookiePolicy();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseSession();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute().RequireAuthorization();
        endpoints.MapControllerRoute(
            name: "Default",
            pattern: "{controller=Home}/{action=Login}"
        );
    });
}

//.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");

我知道這個問題最初是針對ASPNetCore提出的,但是如果您碰巧希望為工作人員服務做同樣的事情,並且像我一樣來到這里,希望這個答案對您有所幫助。

Worker Service 用戶IHostBuilder而不是IWebApplicationBuilder並且不公開 Configuration 屬性,但您可以在 ConfigureServices 方法中接受 IHostBuilderContext 的實例,該方法確實公開了 Configuration 實例。

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

我通過簡單的方式解決了這個問題:

在 Program.cs 中:

using SomeAppName.Startup;

    WebApplication.CreateBuilder(args)
        .RegisterServices()
        .Build()
        .SetupMiddleware()
        .Run();

下一個:

public static WebApplicationBuilder RegisterServices(this WebApplicationBuilder builder)
 {
      BuildConfiguration(builder.Environment);
      //// Any code
 }

最后:

private static IConfiguration BuildConfiguration(IHostEnvironment env)
        {
            var configurationBuilder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("./Configuration/appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile("./Configuration/appsettings.other.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"./Configuration/appsettings.{env.EnvironmentName}.json", optional: true)
                .AddJsonFile($"./Configuration/appsettings.other.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();

            Configuration = configurationBuilder.Build();
            return Configuration;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM