且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

我们为什么不用 MVC 拦截器

更新时间:2021-07-10 02:28:05

一: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); 
        } 
    } 
}


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/p/3559230.html,如需转载请自行联系原作者