Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating Base Controller for ASP.NET core to do logging but something is wrong with my constructor signature?

I want to have an easy way to have all the web api controllers automatically log what they are doing without explicitly tell it. Why is this incorrect ? Also, is there any better ways ?

 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

like image 910
punkouter Avatar asked Oct 23 '25 02:10

punkouter


2 Answers

Need to pass parameters required by base constructor

[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));
    }
}
like image 97
Nkosi Avatar answered Oct 25 '25 17:10

Nkosi


The accepted answer would make all of your controllers tightly coupled with the logger and will diminish the purpose of having a Base Controller. I would propose the following solution

[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));
    }
}
like image 41
Mohamed Salman Avatar answered Oct 25 '25 17:10

Mohamed Salman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!