gpt4 book ai didi

c# - 如何将 LoggerFactory 的实例传递给 ActionFilterAttribute

转载 作者:行者123 更新时间:2023-12-03 23:37:05 26 4
gpt4 key购买 nike

再会。

我正在尝试通过在我的自定义 ActionFilterAttribute 类中注入(inject) LoggerFactory 来使用日志记录,但是在其中一个 Controller 方法中使用 Attribute 时,我收到一条错误消息

[CS7036] There is no argument given that corresponds to the required formal parameter 'logger' of 'Tracker.Tracker(ILoggerFactory)' 

这是该类的实现:
using System;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;

namespace ImmoSales.Tracking
{
public class Tracker : ActionFilterAttribute
{
public string ActionType { get; set; }
public string ActionName { get; set; }
private readonly ILoggerFactory _logger;

public Tracker(ILoggerFactory logger)
{
_logger = logger;
}

public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
}

public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
}

public override void OnResultExecuting(ResultExecutingContext context)
{
base.OnResultExecuting(context);
}

public override void OnResultExecuted(ResultExecutedContext context)
{
base.OnResultExecuted(context);
}
}
}

当我尝试在 Controller 中使用 Tracker 时,出现上述错误,如下所示:
[Tracker(ActionType="testType", ActionName="testName")]
public IActionResult Index()
{
return View();
}

可以做些什么来修复错误?

最佳答案

由于您在 Action 过滤器中进行构造函数注入(inject),您可以使用 ServiceFilter 启用它。您可以在其中传递过滤器类型的属性

[ServiceFilter(typeof(Tracker))]
public IActionResult Index()
{
// to do : return something
}

确保您已在 ConfigureServices 中注册过滤器方法
services.AddScoped<Tracker>();

如果要将其他参数传递给过滤器,可以更新过滤器构造函数以具有这些参数。
public class Tracker : ActionFilterAttribute
{
private string _actionType { get; set; }
private string _actionName { get; set; }
private readonly ILoggerFactory _logger;

public Tracker(ILoggerFactory logger, string actionType, string actionName)
{
this._logger = logger;
this._actionName = actionName;
this._actionType = actionType;
}

public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
}

public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
}

public override void OnResultExecuting(ResultExecutingContext context)
{
base.OnResultExecuting(context);
}

public override void OnResultExecuted(ResultExecutedContext context)
{
base.OnResultExecuted(context);
}
}

并使用 TypeFilter属性以启用您的过滤器,您可以在其中显式传递参数
[TypeFilter(typeof(Tracker), Arguments = new object[] { "Abc", "Xyz" })]
public IActionResult Index()
{
// to do : return something
}

关于c# - 如何将 LoggerFactory 的实例传递给 ActionFilterAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50937171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com