为 ASP.NET 核心创建基础控制器以进行日志记录,但我的构造函数签名有问题?
Creating Base Controller for ASP.NET core to do logging but something is wrong with my constructor signature?
我想有一个简单的方法让所有网络 api 控制器自动记录他们正在做的事情,而不用明确告诉它。为什么这是不正确的?另外,有没有更好的方法?
public class BaseController<T> : ControllerBase where T: BaseController<T>
{
private readonly IAppLogger<T> _logger;
public BaseController(IAppLogger<T> logger)
{
_logger = logger;
}
}
[Route("api/[controller]")]
[ApiController]
public class RfReportTypeController : BaseController<RfReportTypeController>
{
private readonly IRfReportTypeService _rfReportTypeService;
public RfReportTypeController(IRfReportTypeService rfReportTypeService)
{
_rfReportTypeService = rfReportTypeService ?? throw new ArgumentNullException(nameof(rfReportTypeService));
}
}
Severity Code Description Project File Line Suppression State
Error CS7036 There is no argument given that corresponds to the
required formal parameter 'logger' of
BaseController<RfReportTypeController>.BaseController(IAppLogger<RfReportTypeController>)
PWDRS.WebAPI C:\Users\M3MAH02\source\repos\PWDRS\PWDRS\PWDRS.WebAPI\Controllers\RfReportTypeController.cs 17 Active
需要传递基础构造函数所需的参数
[Route("api/[controller]")]
[ApiController]
public class RfReportTypeController : BaseController<RfReportTypeController>
{
private readonly IRfReportTypeService _rfReportTypeService;
public RfReportTypeController(
IRfReportTypeService rfReportTypeService,
IAppLogger<RfReportTypeController> logger //<--NOTE THIS
) : base(logger) //<-- NOTE THIS
{
_rfReportTypeService = rfReportTypeService ?? throw new ArgumentNullException(nameof(rfReportTypeService));
}
}
接受的答案会使您的所有控制器与记录器紧密耦合,并且会削弱拥有基本控制器的目的。我会提出以下解决方案
[Route("api/[controller]")]
[ApiController]
public abstract class BaseController<T> : ControllerBase
{
private IAppLogger<T> _logger;
protected IAppLogger<T> Logger=> _logger ??= HttpContext.RequestServices.GetService<IAppLogger<T>>();
}
public class RfReportTypeController : BaseController<RfReportTypeController>
{
private readonly IRfReportTypeService _rfReportTypeService;
public RfReportTypeController(IRfReportTypeService rfReportTypeService)
{
_rfReportTypeService = rfReportTypeService ?? throw new ArgumentNullException(nameof(rfReportTypeService));
}
}
回应@Mohamed Salman 的回答:
[Route()] 和 [ApiController] 属性不应放在 BaseController 上,因为这不再是路由点。这个基本控制器将被不同的 api 控制器继承,并且它们是使用 [Route()] 和 [ApiController] 属性的控制器。
请检查下面新修改的示例源:
public abstract class BaseController<T> : ControllerBase
{
private IAppLogger<T> _logger;
protected IAppLogger<T> Logger=> _logger ??= HttpContext.RequestServices.GetService<IAppLogger<T>>();
}
[Route("api/[controller]")]
[ApiController]
public class RfReportTypeController : BaseController<RfReportTypeController>
{
private readonly IRfReportTypeService _rfReportTypeService;
public RfReportTypeController(IRfReportTypeService rfReportTypeService)
{
_rfReportTypeService = rfReportTypeService ?? throw new ArgumentNullException(nameof(rfReportTypeService));
}
}
我想有一个简单的方法让所有网络 api 控制器自动记录他们正在做的事情,而不用明确告诉它。为什么这是不正确的?另外,有没有更好的方法?
public class BaseController<T> : ControllerBase where T: BaseController<T>
{
private readonly IAppLogger<T> _logger;
public BaseController(IAppLogger<T> logger)
{
_logger = logger;
}
}
[Route("api/[controller]")]
[ApiController]
public class RfReportTypeController : BaseController<RfReportTypeController>
{
private readonly IRfReportTypeService _rfReportTypeService;
public RfReportTypeController(IRfReportTypeService rfReportTypeService)
{
_rfReportTypeService = rfReportTypeService ?? throw new ArgumentNullException(nameof(rfReportTypeService));
}
}
Severity Code Description Project File Line Suppression State Error CS7036 There is no argument given that corresponds to the required formal parameter 'logger' of
BaseController<RfReportTypeController>.BaseController(IAppLogger<RfReportTypeController>)
PWDRS.WebAPI C:\Users\M3MAH02\source\repos\PWDRS\PWDRS\PWDRS.WebAPI\Controllers\RfReportTypeController.cs 17 Active
需要传递基础构造函数所需的参数
[Route("api/[controller]")]
[ApiController]
public class RfReportTypeController : BaseController<RfReportTypeController>
{
private readonly IRfReportTypeService _rfReportTypeService;
public RfReportTypeController(
IRfReportTypeService rfReportTypeService,
IAppLogger<RfReportTypeController> logger //<--NOTE THIS
) : base(logger) //<-- NOTE THIS
{
_rfReportTypeService = rfReportTypeService ?? throw new ArgumentNullException(nameof(rfReportTypeService));
}
}
接受的答案会使您的所有控制器与记录器紧密耦合,并且会削弱拥有基本控制器的目的。我会提出以下解决方案
[Route("api/[controller]")]
[ApiController]
public abstract class BaseController<T> : ControllerBase
{
private IAppLogger<T> _logger;
protected IAppLogger<T> Logger=> _logger ??= HttpContext.RequestServices.GetService<IAppLogger<T>>();
}
public class RfReportTypeController : BaseController<RfReportTypeController>
{
private readonly IRfReportTypeService _rfReportTypeService;
public RfReportTypeController(IRfReportTypeService rfReportTypeService)
{
_rfReportTypeService = rfReportTypeService ?? throw new ArgumentNullException(nameof(rfReportTypeService));
}
}
回应@Mohamed Salman 的回答: [Route()] 和 [ApiController] 属性不应放在 BaseController 上,因为这不再是路由点。这个基本控制器将被不同的 api 控制器继承,并且它们是使用 [Route()] 和 [ApiController] 属性的控制器。
请检查下面新修改的示例源:
public abstract class BaseController<T> : ControllerBase
{
private IAppLogger<T> _logger;
protected IAppLogger<T> Logger=> _logger ??= HttpContext.RequestServices.GetService<IAppLogger<T>>();
}
[Route("api/[controller]")]
[ApiController]
public class RfReportTypeController : BaseController<RfReportTypeController>
{
private readonly IRfReportTypeService _rfReportTypeService;
public RfReportTypeController(IRfReportTypeService rfReportTypeService)
{
_rfReportTypeService = rfReportTypeService ?? throw new ArgumentNullException(nameof(rfReportTypeService));
}
}