.NET 6中如何在Program.cs类内获取ILoggerFactory实例
在.NET 6中提前获取ILoggerFactory实例的方法
在.NET 5中,我们可以通过Startup构造函数注入ILoggerFactory,再将其传入自定义包的扩展方法:
public Startup( IConfiguration configuration, IHostEnvironment hostEnvironment, ILoggerFactory loggerFactory) { LoggerFactory = loggerFactory; Configuration = configuration; HostEnvironment = hostEnvironment; } public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddCustomMvc(Configuration, loggerFactory: LoggerFactory); }
在.NET 6的顶级语句模式下,若要在app.Build()之前获取ILoggerFactory实例并传给自定义包的AddCustomMvc,可以通过以下两种方式实现:
方法一:构建临时服务提供者获取实例
通过临时构建ServiceProvider,可以从已注册的服务中解析出ILoggerFactory:
var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; // 构建临时服务提供者,解析ILoggerFactory using var tempServiceProvider = builder.Services.BuildServiceProvider(); var loggerFactory = tempServiceProvider.GetRequiredService<ILoggerFactory>(); // 传入自定义包方法 builder.Services.AddCustomMvc(configuration, loggerFactory: loggerFactory); var app = builder.Build(); app.Run();
注意:临时构建的
ServiceProvider会创建服务实例的副本,对于单例服务来说,临时容器中的实例与最终app.Build()生成的容器实例并非同一个。如果自定义包会长期持有该ILoggerFactory,可能引发潜在问题,这种情况下更推荐使用方法二。
方法二:修改自定义包方法,通过依赖注入解析
更合理的方式是调整自定义包的扩展方法,让它在服务容器构建时自动解析ILoggerFactory,而非提前传入实例:
自定义包方法修改示例:
public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration) { // 使用工厂模式注册服务,在容器构建时解析ILoggerFactory services.AddSingleton<IMyCustomService>(serviceProvider => { var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>(); return new MyCustomService(configuration, loggerFactory); }); // 其他Mvc配置逻辑... return services; }
.NET 6中调用示例:
var builder = WebApplication.CreateBuilder(args); // 无需提前获取ILoggerFactory,直接传入配置即可 builder.Services.AddCustomMvc(builder.Configuration); var app = builder.Build(); app.Run();
这种方式遵循依赖注入的设计原则,避免了临时服务提供者带来的潜在问题,同时让服务实例的生命周期由容器统一管理。
内容的提问来源于stack exchange,提问作者Camilo Torres C.
相关产品推荐
相关产品推荐

