如何仅在.NET 6 Program.cs中添加配置?

Mig*_*ura 8 c# asp.net-core asp.net-core-5.0 .net-6.0

在 AspNetCore 5 Web 和 API 项目中,我的程序文件有以下内容:

  public class Program {

    private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
      .SetBasePath(Directory.GetCurrentDirectory())
      .AddJsonFile("settings.json", false, true)
      .AddJsonFile($"settings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", false, true)
      .AddEnvironmentVariables()
      .Build();

    public static Int32 Main(String[] args) {

      CreateHostBuilder(args).Build().Run();

    }

    public static IHostBuilder CreateHostBuilder(String[] args) {

      IHostBuilder builder = Host.CreateDefaultBuilder(args);
        
      builder
        .UseSerilog()
        .ConfigureWebHostDefaults(builder => {
          builder
            .UseConfiguration(Configuration)
            .UseStartup<Startup>();
        });

      return builder;  
      
    }
  
  }
Run Code Online (Sandbox Code Playgroud)

Program.cs现在我使用without将此代码移至 NET 6 Startup.cs

WebApplicationBuilder builder = WebApplication.CreateBuilder();

builder.Configuration
  .SetBasePath(Directory.GetCurrentDirectory())
  .AddJsonFile("settings.json", false, true)
  .AddJsonFile($"settings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", false, true)
  .AddEnvironmentVariables();

builder.Host.UseSerilog();

builder.Host.ConfigureWebHostDefaults(x => { 
  x.UseSerilog(); / ??
  x.UseConfiguration(??); // ??
  x.UseWebRoot("webroot"); 
});

await using WebApplication application = builder.Build();
Run Code Online (Sandbox Code Playgroud)

问题

  1. 我可以在ConfigureWebHostDefaults中设置配置builder.Configuration还是应该在ConfigureWebHostDefaults中进行设置?

  2. 我应该使用builder.Host.UserSerilog或添加 SerilogConfigureWebHostDefaults吗?

这有点令人困惑,因为我可以用不同的方式做事。

Kir*_*kin 8

的托管模型用于WebApplicationBuilder配置网络主机默认值,因此您无需自己调用它。

我可以在里面设置配置builder.Configuration还是应该在里面进行配置ConfigureWebHostDefaults

使用 来执行此操作builder.Configuration

我应该使用builder.Host.UserSerilog或添加 SerilogConfigureWebHostDefaults吗?

使用 来执行此操作builder.Host。Nicholas Blumhardt 在《在 .NET 6 中设置 Serilog》中演示了这一点。

这有点令人困惑,因为我可以用不同的方式做事。

强烈需要向后兼容,特别是因为 .NET 6 应用程序不需要使用新的托管模型。这导致您可以使用几种不同的方法。我预计这会随着未来的版本而改变,但这只是我的猜测。


Gur*_*ron 6

1.我可以在里面设置配置builder.Configuration还是应该在里面进行配置ConfigureWebHostDefaults

要管理配置,您应该使用ConfigurationManager公开的builder.Configuration

builder.Configuration
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("settings.json", false, true)
    .AddJsonFile($"settings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", false, true)
    .AddEnvironmentVariables();
Run Code Online (Sandbox Code Playgroud)

2.我应该使用builder.Host.UserSerilog还是Serilog添加ConfigureWebHostDefaults

来自 Nicholas Blumhardt(Serilog 维护者之一)的github 示例使用builder.Host

builder.Host.UseSerilog((ctx, lc) => // Serilog setup here, use ctx.Configuration for config);
Run Code Online (Sandbox Code Playgroud)