.NET 6中使用Autofac注册ILogger的正确简便方法
在.NET 6 + Autofac的Azure App Service Worker中正确注入ILogger的方法
问题原因
直接调用GetRequiredService<ILogger>()报错,是因为WebJobs Host默认并未注册无泛型参数的ILogger类型,仅注册了泛型版本的ILogger<T>和ILoggerFactory,容器中找不到对应的服务实例。
三种简便的解决方法
方法1:通过ILoggerFactory创建日志实例(推荐,符合原生日志设计)
无需修改Autofac注册,直接从容器获取ILoggerFactory来创建指定名称的日志器:
var host = builder.Build(); var loggerFactory = host.Services.GetRequiredService<ILoggerFactory>(); var logger = loggerFactory.CreateLogger("Program"); // 可自定义日志类别名称 logger.LogCritical("This is a test");
方法2:注册无泛型ILogger到Autofac容器
在Autofac的容器配置中,手动注册无泛型的ILogger,委托ILoggerFactory创建实例:
builder.ConfigureContainer<ContainerBuilder>(builder => { builder.RegisterModule(new AutofacModule()); // 注册无泛型ILogger,指定默认日志类别 builder.Register(ctx => { var factory = ctx.Resolve<ILoggerFactory>(); return factory.CreateLogger("DefaultLogger"); }).As<ILogger>().SingleInstance(); });
完成注册后,即可正常调用GetRequiredService<ILogger>()获取实例。
方法3:使用泛型ILogger(最简洁,类内依赖注入首选)
直接获取泛型版本的日志器,这是.NET日志系统的标准用法,容器默认已注册该类型:
var host = builder.Build(); var logger = host.Services.GetRequiredService<ILogger<Program>>(); logger.LogCritical("This is a test");
如果是在业务类中做依赖注入,直接将ILogger<YourClass>声明为构造函数参数即可,Autofac会自动完成解析。
内容的提问来源于stack exchange,提问作者user1044169
相关产品推荐
相关产品推荐

