• ASP.Net Core 5.0 MVC中AOP思想的体现(五种过滤器)并结合项目案例说明过滤器的用法


    执行顺序

     使用方法,首先实现各自的接口,override里面的方法, 然后在startup 类的 ConfigureServices 方法,注册它们。

                services.AddTransient(typeof(MyAction));
                services.AddTransient(typeof(MyResult));
                services.AddTransient(typeof(MyException));
                services.AddTransient(typeof(MyAuthorize));
                services.AddTransient(typeof(MyResource));
                services.AddTransient(typeof(CheckLogin));

    下面我将代码贴出来,照着模仿就可以了

    IActionFilter

     public class MyAction :Attribute,IActionFilter
        {
            public void OnActionExecuted(ActionExecutedContext context)
            {
                var controllerName = context.RouteData.Values["controller"];
                var actionName = context.RouteData.Values["action"];
                Console.WriteLine($"行为过滤器OnActionExecuted作用于{controllerName }控制器下的{actionName }方法运行之后</br>", Encoding.Default);
            }
    
            public void OnActionExecuting(ActionExecutingContext context)
            {
                var controllerName = context.RouteData.Values["controller"];
                var actionName = context.RouteData.Values["action"];
                Console.WriteLine($"行为过滤器OnActionExecuting作用于{controllerName }控制器下的{actionName }方法运行之前</br>", Encoding.UTF8);
            }
        }

    IResultFilter

        public class MyResult : Attribute,IResultFilter
        {
            public void OnResultExecuted(ResultExecutedContext context)
            {
                var controllerName = context.RouteData.Values["controller"];
                var actionName = context.RouteData.Values["action"];
                Console.WriteLine($"结果过滤器ResultExecuted作用于{controllerName }控制器下的{actionName }方法运行之后</br>", Encoding.Unicode);
            }
    
            public void OnResultExecuting(ResultExecutingContext context)
            {
                var controllerName = context.RouteData.Values["controller"];
                var actionName = context.RouteData.Values["action"];
                Console.WriteLine($"结果过滤器OnResultExecuting作用于{controllerName }控制器下的{actionName }方法运行之前</br>", Encoding.ASCII);
               
            }
        }

    IExceptionFilter

     public class MyException : Attribute,IExceptionFilter
        {
            public void OnException(ExceptionContext context)
            {
                ////调用框架本身异常处理器的方法
                //base.OnException(filterContext);
                var controllerName = context.RouteData.Values["controller"];
                var actionName = context.RouteData.Values["action"];
                //获取异常信息(可以根据实际需要写到本地或数据库中)
                var errorMsg = context.Exception.Message;
                Console.WriteLine($"异常过滤器OnException作用于{controllerName }控制器下的{actionName }方法发生了错误:      {errorMsg}</br>");
                //跳转指定的错误页面
    
                context.ExceptionHandled = true;
            }
        }

    IAuthorizationFilter

        public class MyAuthorize : Attribute,IAuthorizationFilter
        {
            public void OnAuthorization(AuthorizationFilterContext context)
            {
                var controllerName = context.RouteData.Values["controller"];
                var actionName = context.RouteData.Values["action"];
                
                Console.WriteLine($"身份验证过滤器OnAuthorization作用于{controllerName }控制器下的{actionName }方法</br>");
            }
        }

    IResourceFilter

        public class MyResource : Attribute, IResourceFilter
        {
            private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
            public void OnResourceExecuted(ResourceExecutedContext context)
            {
                var controllerName = context.RouteData.Values["controller"];
                var actionName = context.RouteData.Values["action"];
    
    
                //代码执行到这里,就表示一定完成了逻辑计算;就有结果;
                string key = context.HttpContext.Request.Path;
                CacheDictionary[key] = context.Result;
                Console.WriteLine($"资源过滤器OnResourceExecuted 在{controllerName }控制器下的{actionName }方法运行之后,将结果数据缓存起来</br>");
    
             
            }
    
            public void OnResourceExecuting(ResourceExecutingContext context)
            {
                var controllerName = context.RouteData.Values["controller"];
                var actionName = context.RouteData.Values["action"];
    
                ///1.先判断缓存中是否有数据
                ///2.如果有数据,就直接拿着数据走了
                ///3.没有就继续往后,就去实例化控制器,去执行Action做计算 
                //缓存:需要一个key;  只要是key不变,拿到的数据就不变;
                //如果做缓存,一般请求路径不变,数据一般不变; 
                string key = context.HttpContext.Request.Path;
                if (CacheDictionary.Any(item => item.Key == key))
                {
                    Console.WriteLine($"资源过滤器OnResultExecuting   在{controllerName }控制器下的{actionName }方法运行之前 判断有缓存数据,直接返回数据</br>");
                    context.Result = CacheDictionary[key] as IActionResult;
                }
                //如果没有缓存---就继续往后; 
                Console.WriteLine($"资源过滤器OnResultExecuting   在{controllerName }控制器下的{actionName }方法运行之前 判断没有缓存数据</br>");
            }
        }

    效果验证

    执行顺序

     

     发生异常时的顺序

     

    IResourceFilter做数据缓存的效果

     

    !

    • 作       者 : 明志德道
    • 希     望: 如果内容对您有用,动动小手点个赞吧,您的支持就是我持续写作的动力!
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
  • 相关阅读:
    第4月第1天 makefile automake
    第3月30天 UIImage imageWithContentsOfFile卡顿 Can't add self as subview MPMoviePlayerControlle rcrash
    第3月第27天 uitableviewcell复用
    learning uboot fstype command
    learning uboot part command
    linux command dialog
    linux command curl and sha256sum implement download verification package
    learning shell script prompt to run with superuser privileges (4)
    learning shell get script absolute path (3)
    learning shell args handing key=value example (2)
  • 原文地址:https://www.cnblogs.com/for-easy-fast/p/14396996.html
Copyright © 2020-2023  润新知