介紹:
AspectCore是.NET標准的基於AOP的跨平台框架【github解釋】。主要支持:對方面攔截器,依賴注入集成,Web應用程序,數據驗證等的核心支持。
使用實例:
首先安裝dll:
Install-Package AspectCore.Core
引用完dll就可以使用了,我們來創建基本的處理類:ErrorCommandAttribute
介紹就不說了,理論我也知道的不多,直接上代碼:

class ErrorCommandAttribute : AbstractInterceptorAttribute { string _mess; public ErrorCommandAttribute(string methon) { _mess = methon; } /// <summary> /// 每個被攔截的方法中執行 /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public override async Task Invoke(AspectContext context, AspectDelegate next) { try { Console.WriteLine("AddAsync方法開始前"); await next(context); // 執行被攔截的方法 } catch (Exception) { Console.WriteLine("AddAsync方法出錯"); try { //Type[] mytypes = Assembly.GetExecutingAssembly().GetTypes(); Type type= typeof(User);//user 是類 var methom = Activator.CreateInstance(type);//反射創建類 MethodInfo methodinfo = type.GetMethod(_mess);//獲取方法 _mess參數是自定義字符串為方法名稱 methodinfo.Invoke(methom, null);//運行方法 } catch (Exception ex) { throw; } throw; } finally { Console.WriteLine("AddAsync方法結束"); } } }
只簡單介紹下方法的形式:Invoke
該方法是繼承AbstractInterceptorAttribute類之后必須實現得類;
然后try:是在方法執行之前執行;所有我們在檢測方法開始之前要想做一些操作可以寫在這里
catch:只有在檢測的方法出現異常才會執行;這里是檢測方法出異常了,需要做的操作,
finally:都會執行
我們再來看一下方法類:user

public class User { [ErrorCommand("Error1")] public virtual async Task<int> AddAsync() { Console.WriteLine("開始方法:AddAsync"); throw new Exception("出錯了"); return 0; } public async Task<int> Error1() { Console.WriteLine("開始方法:Error1"); return 1; } }
很明顯我們寫的特性類只需要在需要檢測的方法上面加特性就好了。這里特別注意就是,需要加特性的方法必須是虛方法,也就是必須加virtual 修飾。不然不會被調用。
最后看一下如何使用方法:

static void Main(string[] args) { Console.WriteLine("開始程序"); //User user = new User(); //user.AddAsync(); ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder(); using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build()) { User p = proxyGenerator.CreateClassProxy<User>(); p.AddAsync(); } Console.ReadLine(); }
與正常的使用類方法看出來了:我們new User類的時候不是傳統的方式,必須使用組件的CreateClassProxy方法;
2018-06-23:
修改攔截器方法:
攔截方法從指定類型擴展為公共方法,自定義類型,這樣就可以單獨提取出來,不用每一個類型寫一個類,可以自動獲取到類型,然后可以重復使用:
public override async Task Invoke(AspectContext context, AspectDelegate next) { try { Console.WriteLine("AddAsync方法開始前"); await next(context); // 執行被攔截的方法 } catch (Exception) { Console.WriteLine("AddAsync方法出錯"); //重復調用示例 ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder(); using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build()) { var baseClass = context.Proxy; foreach (var item in baseClass.GetType().GetMethods()) { if (item.Name.ToString() == _mess) { MethodInfo methodinfo = baseClass.GetType().GetMethod(_mess); methodinfo.Invoke(baseClass, null); } } } throw; } finally { Console.WriteLine("AddAsync方法結束"); } }
系列目錄:
微服務系列文章主要介紹微服務所使用到的一些技術和一些技術示例: