zoukankan      html  css  js  c++  java
  • 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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
  • 相关阅读:
    byte b=1、b=b+1、b+=1
    parameter ‘0’ not found
    Java设计模式—Singleton
    EL JSTL(得劲)
    天网恢恢Filter 窃听风云Listener
    Jsp学习总结(二)
    Jsp学习总结(一)
    Bugs(识破)
    [PAT乙级] Practise 1016 部分A+B
    [PAT乙级] Practise 1015 德才论
  • 原文地址:https://www.cnblogs.com/for-easy-fast/p/14396996.html
Copyright © 2011-2022 走看看