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

Mun*_*kin 17 c# configuration .net-core asp.net-core .net-6.0

这似乎是一个类似的问题,但没有一个答案适合我的代码...:阅读 Main Program.cs 中的 appsettings.json

这非常相似,但由于某种原因对我不起作用:ASP.NET Core 6 how to access Configuration during setup

我正在将 .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;
        }
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

using Microsoft.Extensions.Configuration;
// IConfiguration init test
var Configuration = builder.Configuration;
Run Code Online (Sandbox Code Playgroud)

似乎 Microsoft.Extensions.Configuration 甚至没有被使用!我得到的语法来自这篇博客文章:https://gavilan.blog/2021/08/19/getting-the-iconfiguration-in-the-program-class-asp-net-core-6/

这个问题很原始,但我似乎没有搞清楚。感谢任何帮助解决此问题的帮助,因为它可以在新的 .NET 6 最小 API 中工作。

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

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

secret = Startup.Configuration["GoogleRecaptchaV3:Secret"];
                path = Startup.Configuration["GoogleRecaptchaV3:ApiUrl"];
Run Code Online (Sandbox Code Playgroud)

我尝试用程序替换启动,但似乎不起作用......

我收到的错误是:

'Program' does not contain a definition for 'Configuration'
Run Code Online (Sandbox Code Playgroud)

Gur*_*ron 28

  1. 不需要切换到最小托管模式,您仍然可以使用通用托管(具有启动功能的托管)。

似乎 Microsoft.Extensions.Configuration 甚至没有被使用!

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

3.

var 配置 = builder.Configuration;

新模板中的文件Program使用另一个相对较新的功能 (C# 9) -顶级语句,因此它var Configuration只是一个只能在生成的Main方法内部访问的变量。

4.

秘密 = Startup.Configuration["GoogleRecaptchaV3:秘密"];

您可以通过以下方式在顶级语句文件中访问该值:

var secret = builder.Configuration["GoogleRecaptchaV3:Secret"];
Run Code Online (Sandbox Code Playgroud)

为了使设置可以在该文件外部(或Startup在通用托管中)访问,我强烈建议使用 DI(如此此处的文档所示)。

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

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

public partial class Program
{
    internal static IConfiguration Configuration  { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

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