这似乎是一个类似的问题,但没有一个答案适合我的代码...:阅读 Main Program.cs 中的 appsettings.json
这非常相似,但由于某种原因对我不起作用:ASP.NET Core 6 如何在安装过程中访问配置
我正在将 .NET 6 beta 应用程序移植到 .NET 6 的稳定版本。
这意味着我想移植负责导入 IConfiguration 的代码(是的,我知道它向后兼容单独的
Startup.cs
和 Program.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 甚至没有被使用!我得到的语法来自这篇博客文章: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"];
我尝试用程序替换启动,但似乎不起作用......
我遇到的错误是:
'Program' does not contain a definition for 'Configuration'
似乎 Microsoft.Extensions.Configuration 甚至没有被使用!
不需要
using Microsoft.Extensions.Configuration;
指令,因为新功能 global using 指令 在 .NET 6 模板中被大量使用。
3.
var 配置 = builder.Configuration;
新模板中的
Program
文件使用另一个相对较新的功能 (C# 9) - 顶级语句,因此 var Configuration
只是一个只能在生成的 Main
方法内访问的变量。
4.
secret = Startup.Configuration["GoogleRecaptchaV3:Secret"];
您可以通过以下方式在顶级语句文件中访问该值:
var secret = builder.Configuration["GoogleRecaptchaV3:Secret"];
为了使设置可以在该文件外部访问(或通用托管中的
Startup
),我强烈建议使用 DI(如文档here或here中所示)。
如果您有大量代码依赖于可用的静态配置,并且需要快速临时修复,您可以在顶级语句文件的末尾添加
partial Program
类并执行以下操作:
// ....
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 的评论进行编辑。