c# - 为 ASP.NET 核心创建基本控制器以进行日志记录,但我的构造函数签名有问题?
问题描述
我想有一个简单的方法让所有的 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 活动
解决方案
接受的答案将使您的所有控制器与记录器紧密耦合,并会削弱拥有基本控制器的目的。我会提出以下解决方案
[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));
}
}
推荐阅读
- node.js - 如何以保存在节点服务器上的角度显示图像
- python - 如何决定 keras 密集层构造函数使用哪些参数?
- python - 从scrapy获取无
- javascript - JavaScript 中的 Promise 即使没有被消耗也能保证取得进展吗?
- azure-cosmosdb - Azure cosmos db 存储过程不起作用
- scala - 如何在scala函数式编程中实现db操作
- angular - 最简单的 ControlValueAccessor 不起作用
- sql-server - 如何在 SQL Server 中检查列中的特殊字符?
- php - 如果数组为空,Google Ads API 将如何反应?
- laravel - Laravel 护照创建令牌和刷新令牌