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

Posted

技术标签:

【中文标题】如何仅在 .NET 6 Program.cs 中添加配置?【英文标题】:How to add configuration in .NET 6 Program.cs only? 【发布时间】:2022-01-18 18:48:06 【问题描述】:

在 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;  
      
    
  
  

现在我正在使用 Program.cs 而不使用 Startup.cs 将此代码移动到 NET 6:

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();

问题

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

    我应该使用builder.Host.UserSerilog还是在ConfigureWebHostDefaults中添加Serilog?

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

【问题讨论】:

【参考方案1】:

new hosting model 使用WebApplicationBuilder 来配置网络主机默认值,因此您无需自己调用它。

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

使用builder.Configuration 执行此操作。

我应该使用builder.Host.UserSerilog 还是在ConfigureWebHostDefaults 中添加 Serilog?

使用builder.Host 执行此操作。 Nicholas Blumhardt 在Setting up Serilog in .NET 6 中演示了这一点。

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

非常需要向后兼容,尤其是当 .NET 6 应用程序不需要使用新的托管模型时。这导致您可以使用几种不同的方法。我预计这会随着未来的发布而改变,但这只是我的猜测。

【讨论】:

【参考方案2】:

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

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

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

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

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

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

【讨论】:

以上是关于如何仅在 .NET 6 Program.cs 中添加配置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET 6 最小 API Program.cs 中访问 DbContext

从 .net 6 的代码覆盖范围中排除 Program.cs [重复]

将依赖项传递给 .NET 6 中 program.cs 中的 app.[Methods()]

在 .NET 6 项目中使用 Startup.cs

在 .NET 6 中使用 Startup.cs 更简洁的方法

如何在 .net6 中使用 WebApplicationFactory(没有可说的入口点)