如何仅在 .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()]