ASP.NET Core Filter如何支持依赖注入

概述

通过使用 ASP.NET Core 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码。内置筛选器处理任务,例如:授权(防止用户访问未获授权的资源)。响应缓存(对请求管道进行短路出路,以便返回缓存的响应)。可以创建自定义筛选器,用于处理横切关注点。 横切关注点的示例包括错误处理、缓存、配置、授权和日志记录。 筛选器可以避免复制代码。 例如,错误处理异常筛选器可以合并错误处理。

ASP.NET Core Filter如何支持依赖注入?可以通过全局注册,支持依赖注入。通过TypeFilter(typeof(Filter)) 标记在方法,标记在控制器。通过ServiceType(typeof(Filter))标记在方法,标记在控制器,必须要注册Filter这类;TypeFilter和ServiceType的本质是实现了一个IFilterFactory接口;

代码实现

1、普通Filter使用,继承: Attribute, IActionFilter。

 public class TestActionFilterAttribute : Attribute, IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
            if (context.HttpContext.Request.Query.TryGetValue("id", out StringValues value))
            {
                Console.WriteLine(value.First());
            }
            else
            {
                context.HttpContext.Response.Redirect("/Error/404");
            }
        }


        public void OnActionExecuting(ActionExecutingContext context)
        { }
    }
   [TestActionFilter]
        public IActionResult Index()
        {
            return View();
        }

2、使用  [TypeFilter(typeof(TestActionFilterAttribute))]注入。

  public class TestActionFilterAttribute : Attribute, IActionFilter
    {
        private readonly ILogger _logger;


        public TestActionFilterAttribute(ILoggerFactory logger)
        {
            _logger = logger.CreateLogger("TestActionFilterAttribute");
        }


        public void OnActionExecuted(ActionExecutedContext context)
        {
            _logger.LogDebug($"11111");


            if (context.HttpContext.Request.Query.TryGetValue("id", out StringValues value))
            {
                Console.WriteLine(value.First());
            }
            else
            {
                context.HttpContext.Response.Redirect("/Error/404");
            }
        }


        public void OnActionExecuting(ActionExecutingContext context)
        { }
    }
  [TypeFilter(typeof(TestActionFilterAttribute))]
        public IActionResult Index()
        {
            return View();
        }


3、使用 [ServiceFilter(typeof(TestActionFilterAttribute))]注入。

  [ServiceFilter(typeof(TestActionFilterAttribute))]
        public IActionResult Index()
        {
            return View();
        }

运行测试,发现报错

于是ConfigureServices加上services.AddSingleton<TestActionFilterAttribute>();

  // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<TestActionFilterAttribute>();


            services.AddControllersWithViews();
        }

运行测试,成功。

4、通过全局注册

   public void ConfigureServices(IServiceCollection services)
        {
            // services.AddSingleton<TestActionFilterAttribute>();


            services.AddControllersWithViews(options =>
            {
                // 添加全局异常
                options.Filters.Add<TestActionFilterAttribute>();
            });
        }

代码地址:

https://gitee.com/conanOpenSource_admin/service-filter_-type-filter

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值