Program.cs 中的 .NET 6(稳定)IConfiguration 设置

.NET 6 (stable) IConfiguration setup in Program.cs

这似乎是一个类似的问题,但 none 的答案适合我的代码...:

这非常相似,但出于某种原因对我不起作用:

我正在将 .NET 6 beta 应用程序移植到 .NET 6 的稳定版本。

这意味着我想移植负责导入 IConfiguration 的代码(是的,我知道它向后兼容单独的 Startup.csProgram.cs 文件,但我愿意使用新语法)。 IConfiguration 基本上是 ASP.NET Core.appsettings.json 中的文件。

在旧代码中它看起来像这样:

 public class Startup
    {
        internal static IConfiguration Configuration { get; private set; }
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

我尝试了以下方法:

using Microsoft.Extensions.Configuration;
// IConfiguration init test
var Configuration = builder.Configuration;

好像连Microsoft.Extensions.Configuration都没用!我得到的语法来自这个博客 post: https://gavilan.blog/2021/08/19/getting-the-iconfiguration-in-the-program-class-asp-net-core-6/

这个问题很原始,但我似乎没有做对。感谢任何帮助解决这个问题,因为它适用于新的 .NET 6 minimal API.

我发现这个指南很有用,但它显然没有解决手头的问题: https://www.mikesdotnetting.com/article/357/razor-pages-startup-in-net-6

在另一个模型中,我有这个代码也不再有效:

secret = Startup.Configuration["GoogleRecaptchaV3:Secret"];
                path = Startup.Configuration["GoogleRecaptchaV3:ApiUrl"];

我尝试用 Program 替换 Startup 但它似乎不起作用...

我遇到的错误是:

'Program' does not contain a definition for 'Configuration'
  1. 正在切换到 minimal hosting model is not required, you can still use the generic hosting(启动的那个)。

It seems that the Microsoft.Extensions.Configuration isn't even used!

不需要 using Microsoft.Extensions.Configuration; 指令,因为新功能 在 .NET 6 模板中被大量使用。

3.

var Configuration = builder.Configuration;

新模板中的 Program 文件使用了另一个相对较新的功能 (C# 9) - top-level statements,因此 var Configuration 只是一个变量,只能在生成的 Main方法。

4.

secret = Startup.Configuration["GoogleRecaptchaV3:Secret"];

您可以通过以下方式在 top-level 语句文件中访问此值:

var secret = builder.Configuration["GoogleRecaptchaV3:Secret"];

要使设置可在该文件之外访问(或在通用托管中 Startup),我强烈建议使用 DI(如文档 here or here 中所示)。

如果您有大量代码依赖于可用的静态配置并且您需要快速临时修复,您可以在 top-level 末尾添加 partial Program class语句文件并执行如下操作:

// ....
WebApplication app = builder.Build();
Configuration = app.Configuration;
// ...

public partial class Program
{
    internal static IConfiguration Configuration  { get; private set; }
}

但我强烈建议不要这样做。

以下是基本的直接实现:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var config = app.Configuration;

根据 Guru Stron 的评论进行编辑。