2

我想有一个简单的方法让所有的 web 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));
    }
}

严重性代码 描述 项目文件行抑制状态错误 CS7036 没有给出与 BaseController<RfReportTypeController>.BaseController(IAppLogger<RfReportTypeController>) PWDRS.WebAPI C:\Users\M3MAH02\source\repos\PWDRS\PWDRS\PWDRS.WebAPI\Controllers所需的形式参数“logger”相对应的参数RfReportTypeController.cs 17 活动

4

3 回答 3

2

接受的答案将使您的所有控制器与记录器紧密耦合,并会削弱拥有基本控制器的目的。我会提出以下解决方案

[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));
    }
}
于 2021-03-22T04:26:47.950 回答
2

需要传递基础构造函数所需的参数

[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));
    }
}
于 2019-11-06T17:26:14.923 回答
0

回应@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));
    }
}
于 2021-06-03T08:19:55.167 回答