.NET 6中Program类如何调用接口?
在.NET 6 Program类中实现ILogger的依赖注入
在.NET 6的顶级语句模式下,没有单独的Startup类,要获取ILogger实例有两种常用方式:
方式一:构建WebApplication后直接从服务容器获取
当你完成WebApplicationBuilder的配置并构建出WebApplication实例后,可以直接从其服务容器中解析ILogger:
var builder = WebApplication.CreateBuilder(args); // 添加其他服务配置,比如控制器、Razor页面等 builder.Services.AddControllers(); var app = builder.Build(); // 从服务容器获取ILogger实例 var logger = app.Services.GetRequiredService<ILogger<Program>>(); logger.LogInformation("Program类中成功获取Logger"); // 后续中间件配置 app.MapControllers(); app.Run();
方式二:在配置服务阶段临时获取Logger(适合启动过程提前用日志的场景)
如果需要在构建WebApplication之前就使用Logger(比如配置服务时输出日志),可以临时构建服务容器来获取:
var builder = WebApplication.CreateBuilder(args); // 临时构建服务容器获取Logger var tempServiceProvider = builder.Services.BuildServiceProvider(); var logger = tempServiceProvider.GetRequiredService<ILogger<Program>>(); logger.LogInformation("在配置服务阶段获取Logger"); // 临时服务容器用完及时释放,避免资源泄漏 tempServiceProvider.Dispose(); // 继续配置其他服务 builder.Services.AddControllers(); var app = builder.Build(); app.MapControllers(); app.Run();
关于直接var logger = ILogger报错的原因
ILogger是接口类型,不能直接作为变量赋值,必须从依赖注入容器中解析出它的具体实现类实例。这和.NET 3.x中构造函数注入的本质一致——都是从服务容器获取实例,只是.NET 6顶级语句模式下写法不同。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

