.NET 6 Web API中能否在Program类中注入并调用DProvider?
在.NET 6 ASP.NET Web API的Program类内部调用已注册服务的方法是可行的
你当前的代码存在两处问题:一是_dProvide变量未初始化,二是同步的Main方法里不能直接使用await。修正后就能正常调用接口方法,以下是可行的代码示例:
public class Program { // 将Main改为async Task类型以支持异步调用 public static async Task Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddSingleton<IDProvider, DProvider>(); // 从服务容器中获取IDProvider的实例 using var serviceProvider = builder.Services.BuildServiceProvider(); var dProvider = serviceProvider.GetRequiredService<IDProvider>(); var logConnectionString = await dProvider.GetValue("abc"); // 继续完成Web应用的构建与启动 var app = builder.Build(); app.UseAuthorization(); app.MapControllers(); await app.RunAsync(); } }
需要注意的几个点:
- 必须把
Main方法的签名改为async Task Main,因为你调用的GetValue是异步方法,需要用await等待执行完成。 - 不能直接使用未初始化的变量,必须通过服务容器的
GetRequiredService<IDProvider>()方法获取已注册的服务实例,该方法会在服务未注册时抛出异常,避免空引用问题。 - 如果你是在Web应用构建完成后(即
builder.Build()之后)需要调用服务,也可以通过app.Services来获取实例,效果是一致的。
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

