.Net?Core?Aop之IResourceFilter的具體使用
一、簡介
在.net core 中Filter分為以下六大類:
- 1、AuthorizeAttribute(權(quán)限驗(yàn)證)
- 2、IResourceFilter(資源緩存)
- 3、IActionFilter(執(zhí)行方法前后的記錄)
- 4、IResultFilter(結(jié)果生成前后擴(kuò)展)
- 5、IAlwaysRun(響應(yīng)結(jié)果的補(bǔ)充)
- 6、IExceptionFilter(異常處理)
二、IResourceFilter(同步資源緩存)
1、定義Filter
public class CustomerResourceFilterAttribute : Attribute, IResourceFilter
{
private static Dictionary<string,object> cacheDic=new Dictionary<string, object>();
public void OnResourceExecuting(ResourceExecutingContext context)
{
var path=context.HttpContext.Request.Path;
if (cacheDic.ContainsKey(path))
{
context.Result = (IActionResult)cacheDic[path];
}
Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecuting");
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
var path = context.HttpContext.Request.Path;
cacheDic[path] = context.Result;
Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecuted");
}
}2、使用Filter
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
Console.WriteLine($"執(zhí)行 {this.GetType().Name} 構(gòu)造函數(shù)");
}
[CustomerResourceFilter]
public IActionResult Index()
{
ViewBag.Data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
return View();
}
}3、前端頁面代碼
@{
ViewData["Title"] = "Home Page";
}
<h3>來自于控制器的結(jié)果:@ViewBag.Data</h3>
<h3>來自于頁面的結(jié)果:@DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")</h3>4、頁面效果
按F5可以看到頁面值的變化效果,"來自于控制器的結(jié)果"的值會(huì)一直不變,“來自于頁面的結(jié)果”隨著頁面刷新,值會(huì)一直變化

三、IAsyncResourceFilter(異步資源緩存)
public class CustomerAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter
{
private static Dictionary<string, object> cacheDic = new Dictionary<string, object>();
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecutionAsync Before");
var path = context.HttpContext.Request.Path;
if (cacheDic.ContainsKey(path))
{
context.Result = (IActionResult)cacheDic[path];
}
else
{
ResourceExecutedContext resource =await next.Invoke();
cacheDic[path] = resource.Result; // 這句話的執(zhí)行就是去執(zhí)行控制器的構(gòu)造函數(shù)+Action
Console.WriteLine("CustomerResourceFilterAttribute.OnResourceExecutionAsync After");
}
}
}四、總結(jié)
不管是同步還是異步,他們的執(zhí)行順序其實(shí)都是一樣的,下面是同步和異步分別打印的日志記錄:
1、同步日志

2、異步日志

到此這篇關(guān)于.Net Core Aop之IResourceFilter的具體使用的文章就介紹到這了,更多相關(guān).Net Core Aop IResourceFilter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux服務(wù)器下利用Docker部署.net Core項(xiàng)目的全過程
這篇文章主要給大家介紹了關(guān)于在Linux服務(wù)器下利用Docker部署.net Core項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
asp.net中實(shí)體類對(duì)象賦值到表單的實(shí)現(xiàn)代碼
昨天在網(wǎng)上看到了一個(gè)利用反射表單賦值到實(shí)體類對(duì)象的一個(gè)方法,自己就在加了個(gè)方法,從實(shí)體對(duì)象到表單,覺的很不錯(cuò)非常省事,所以把他寫成了一個(gè)類,供以后使用2010-11-11
ASP.NET Core對(duì)Controller進(jìn)行單元測試的完整步驟
這篇文章主要給大家介紹了關(guān)于ASP.NET Core對(duì)Controller進(jìn)行單元測試的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
c# 可變數(shù)目參數(shù)params實(shí)例
一般來說,參數(shù)個(gè)數(shù)都是固定的,定義為集群類型的參數(shù)可以實(shí)現(xiàn)可變數(shù)目參數(shù)的目的,但是.NET提供了更靈活的機(jī)制來實(shí)現(xiàn)可變數(shù)目參數(shù),這就是使用params修飾符2012-11-11
詳解.NET中string與StringBuilder在字符串拼接功能上的比較
string與StringBuilder的在字符串拼接時(shí)執(zhí)行效率上有差異,這篇文章主要介紹了詳解.NET中string與StringBuilder在字符串拼接功能上的比較,感興趣的小伙伴們可以參考一下2018-11-11
判斷WebBrowser瀏覽器網(wǎng)頁加載完成的處理方法
.net 中通過 SqlConnection 連接 sql server,我們會(huì)發(fā)現(xiàn)第一次連接時(shí)總是很耗時(shí),但后面連接就很快,這個(gè)其實(shí)和SqlConnection 的連接池機(jī)制有關(guān),正確的理解這個(gè)連接池機(jī)制,有助于我們編寫高效的數(shù)據(jù)庫應(yīng)用程序。2013-04-04

