您的位置:首页 > 编程语言 > ASP

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

2021-02-10 23:22 1571 查看

执行顺序

 

 使用方法,首先实现各自的接口,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);

}

56c
}

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"];

ad8
//获取异常信息(可以根据实际需要写到本地或数据库中)
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>");
}
}

效果验证

执行顺序

 

 

& ad8 nbsp;

 发生异常时的顺序

 

 

IResourceFilter做数据缓存的效果

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐