zoukankan      html  css  js  c++  java
  • 我们为什么不用 MVC 拦截器

    一:MVC 中的拦截器

    众所周知,MVC 存在如下几个主要的拦截器:IActionFilter、IExceptionFilter、IResultFilter、IAuthorizationFilter,

    但是我们并不用这些拦截器,因为:

    我们的业务逻辑面向多个平台,即有 Winform,有 Web Mvc 控制器,还有 Ios 等手机终端,在这些前台调用我们的服务的时候,我们不想为每个平台或者框架,使用它们各自的拦截器。

    即便我们的平台只使用 Mvc ,我们也不使用这些拦截器,因为

    1:基于 Attribute 的拦截器不能接受运行时参数。在MVC 的拦截器中可以得到 Http 上下文,如果你的参数藏在 Http Header 或者 Content 中,你也许会说,我们可以很容易的在拦截器内部获取到这些参数。但是,谁说参数一定来自于 Http 中。

    2:基于 Attribute 的拦截器只能在方法开始和结束的时候注入代码。这有时候是个优点,

    所有,我们需要一个通用的拦截器。

    二:通用拦截器

    public JsonResult TestJson()
    {
        return FrontProtector.Do1<JsonResult>(()=>
        {
            JsonResult re = new JsonResult();
            return re;
        });
    }

    public ActionResult TestAction()
    {
        return null;
    }

    public int TestInt(){
        return FrontProtector.Do2<int>(()=>
        {
            return 0;
        });
    }

    class FrontProtector
    {
        public static T Do1<T>(Func<T> func) where T: class
        {
            T t =  default(T);
            try
            {
                // 1: 记录日志;
                // 2: 登录判断;
                // 3: 如果有必要的话, 权限欺骗;
                t = func();
                return t;
            }
            catch
            {
                // 3: 包装异常;
                if( t is JsonResult)
                {
                    return new JsonResult() as T;
                }
               
                return new {} as T;
            }
        }
       
        public static T Do2<T>(Func<T> func) where T: struct
        {
            T t = default(T);
            try
            {
                t = func();
                return t;
            }
            catch
            {
                return default(T);
            }
        }
    }

  • 相关阅读:
    10-3 集合之Set
    【Angular】排序
    【Mongous】
    【验证码】
    爬虫
    【DOM】
    年月日
    【Mocha】
    【Test】
    洛谷——P1823 音乐会的等待
  • 原文地址:https://www.cnblogs.com/luminji/p/3559230.html
Copyright © 2011-2022 走看看