亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將 LoggerFactory 的實例傳遞給 ActionFilterAttribute

如何將 LoggerFactory 的實例傳遞給 ActionFilterAttribute

C#
Cats萌萌 2021-08-22 15:17:21
美好的一天。我正在嘗試通過在我的自定義 ActionFilterAttribute 類中注入 LoggerFactory 來使用日志記錄,但是在控制器方法之一中使用 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);        }    }}當我嘗試在控制器中使用跟蹤器時出現上述錯誤,如下所示:[Tracker(ActionType="testType", ActionName="testName")]public IActionResult Index(){    return View();}可以做些什么來修復錯誤?
查看完整描述

1 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

由于您正在操作過濾器中進行構造函數注入,因此您可以使用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

}


查看完整回答
反對 回復 2021-08-22
  • 1 回答
  • 0 關注
  • 196 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號