打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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做数据缓存的效果

 

 

 

来源:https://www.icode9.com/content-1-853851.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ASP.NET MVC 过滤器(五)
ASP.NET MVC 流程概述(转)
Asp.Net Core 轻松学-被低估的过滤器
ASP.NET Core MVC 从入门到精通之Filter
ASP.NET Web API 接口执行时间监控
EF Code First学习笔记:数据库创建
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服