.NET 7项目中ILogger无法注入的问题及解决咨询
问题场景
原本日志功能正常的.NET 7 Core项目,在AccountController中注入日志时抛出解析异常。
控制器代码
public class AccountController : ControllerBase { private readonly IConfiguration? _configuration; private readonly ILogger<AccountController>? _logger; public AccountController(IConfiguration? configuration, ILogger? logger) { _configuration = configuration; _logger = (ILogger<AccountController>?)logger; } }
抛出异常
System.InvalidOperationException: Unable to resolve service for type
'Microsoft.Extensions.Logging.ILogger' while attempting to activate
'Modules.Authenticate.Core.Controllers.Api.AccountController'. at
Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider
sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
at lambda_method9(Closure, IServiceProvider, Object[]) at
Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.g__CreateController|0(ControllerContext
controllerContext) at
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State&
next, Scope& scope, Object& state, Boolean& isCompleted) at
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|20_0(ResourceInvoker
invoker, Task lastTask, State next, Scope scope, Object state, Boolean
isCompleted) at
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker
invoker, Task task, IDisposable scope) at
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker
invoker, Task task, IDisposable scope) at
Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint
endpoint, Task requestTask, ILogger logger) at
Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext
httpContext) at
Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext
httpContext, ISwaggerProvider swaggerProvider) at
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext
context) at
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext
context) at
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext
context)
解决方法
核心原因
.NET Core默认依赖注入容器中,仅自动注册泛型版本的ILogger<T>,非泛型的ILogger并未被默认添加到服务容器,因此无法被解析。
修正代码
将构造函数中的参数类型改为泛型的ILogger<AccountController>,同时移除不必要的强制转换:
public class AccountController : ControllerBase { private readonly IConfiguration? _configuration; private readonly ILogger<AccountController>? _logger; public AccountController(IConfiguration? configuration, ILogger<AccountController>? logger) { _configuration = configuration; _logger = logger; } }
额外说明
- 如果项目启用了nullable引用类型,
?可以保留;若确保注入不会为null,也可直接移除?。 - 无需手动注册
ILogger<T>,.NET Core模板默认已通过WebApplication.CreateBuilder自动配置日志服务。
内容的提问来源于stack exchange,提问作者jstuardo

