首页后端开发ASP.NETASP.Net Core 5.0 MVC中AOP思想的体现(五种过滤器)并结合项目案例说明过滤器的用法

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

时间2023-12-04 01:15:03发布访客分类ASP.NET浏览1657
导读:执行顺序 使用方法,首先实现各自的接口,override里面的方法, 然后在startup 类的 ConfigureServices 方法,注册它们。 services.AddTransient(typeof(MyAc...

执行顺序

 使用方法,首先实现各自的接口,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 Dictionarystring, object>
     CacheDictionary = new Dictionarystring, 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做数据缓存的效果

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: ASP.Net Core 5.0 MVC中AOP思想的体现(五种过滤器)并结合项目案例说明过滤器的用法
本文地址: https://pptw.com/jishu/566958.html
ASP.Net Core 5.0 MVC Session的添加,及它与Cookie的关系 ASP.Net Core 5.0 MVC AppSettings配置文件读取,Startup 类中ConfigureServices 方法、Configure 方法的使用

游客 回复需填写必要信息