如何在ASP.NET Core 6中注入IConfiguration

17

现在网站或者API应用程序中已经没有Startup.cs了

我们曾经可以将注入到那个Startup类中

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration
    }
    ...
}

现在这些添加服务和配置代码已经移动到 Program.cs 中,那么从那里访问配置的正确方法是什么?


UseStartup 看起来在 ASP.NET Core 6 中仍然存在,尽管我还没有更新到 VS2022,因此无法测试。 - ProgrammingLlama
这个回答解决了你的问题吗?如何在ASP.NET Core中的任何类中访问Configuration? - JHBonarius
如果您的问题是关于在设置期间访问配置,请参阅此答案。另外,如果您愿意,您不必使用新的最小托管模型,可以切换到通用模型。 - Guru Stron
3个回答

19

IConfiguration可以在WebApplicationBuilder 中访问。

enter image description here

因此,不再需要注入IConfiguration,它现在是Program.csbuilder的一个属性。 enter image description here

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

builder.Services.AddInfrastructureServices(config);
builder.Services.AddPersistenceServices(config);

3
我遇到了 'IServiceCollection' does not contain a definition for 'AddInfrastructureServices' 的问题,同样的问题也出现在 AddPersistenceServices 上(你代码的最后两行)。 - Matthieu Charbonnier
我认为这里缺少的一部分是你在 AddInfrastructureServicesAddPersistenceServices IServiceCollection 扩展方法中对 config 的处理。 - Jerome
如果我需要在处理程序类中访问IConfiguration,我该怎么办? - Bronek

6
据我所知,他们用WebApplicationBuilder的一个属性作为ConfigurationManager类的具体实例来替换了它。
在你的Program.cs类中有一行代码:
 var builder = WebApplication.CreateBuilder(args);

你可以从这个构建器实例中访问配置:

 builder.Configuration.GetConnectionString("DefaultConnection");

我知道这并不能回答你的“如何注入IConfiguration”问题,但我猜测你只是想能够访问你的配置设置。没有任何阻止你将项目设置为与旧的.NET 5代码相同。你所需要的只是将Program.cs设置为:

public class Program
{
    public static async Task Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        await host.RunAsync();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
                webBuilder.ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(LogLevel.Trace);
                });
            });
}

然后只需创建一个名为 Startup.cs 的类,并使用以下代码:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    private IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        // TODO: Service configuration code here...
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // TODO: App configuration code here...
    }
}

4
您可以在ConfigureServices方法中将IConfiguration实例作为单例对象添加到服务集合中:
public void ConfigureServices(IServiceCollection service)
{ 
    services.AddSingleton<IConfiguration>(Configuration);  
    //...
}

这允许您在任何控制器或类中注入IConfiguration

public class UserController
{
  public UserController(IConfiguration configuration)   
  //Use IConfiguration instance here
}

2
不要这样做。单例将持续整个应用程序的生命周期。对于Web应用程序,它将持续整个Web服务器的生命周期。您必须重新启动Web服务器才能获取新实例。其他原因:在Asp.net中是否使用Singleton进行DI而不是Scoped、Transient尽可能使用是否是一种不好的实践? - kkuilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接