介紹:html
AspectCore是.NET標準的基於AOP的跨平臺框架【github解釋】。主要支持:對方面攔截器,依賴注入集成,Web應用程序,數據驗證等的核心支持。git
首先安裝dll:github
Install-Package AspectCore.Corewindows
引用完dll就能夠使用了,咱們來建立基本的處理類:ErrorCommandAttribute框架
介紹就不說了,理論我也知道的很少,直接上代碼:async
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方法結束"); } } }
只簡單介紹下方法的形式:Invokeide
該方法是繼承AbstractInterceptorAttribute類以後必須實現得類;微服務
而後try:是在方法執行以前執行;全部咱們在檢測方法開始以前要想作一些操做能夠寫在這裏ui
catch:只有在檢測的方法出現異常纔會執行;這裏是檢測方法出異常了,須要作的操做,spa
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方法;
攔截方法從指定類型擴展爲公共方法,自定義類型,這樣就能夠單獨提取出來,不用每個類型寫一個類,能夠自動獲取到類型,而後能夠重複使用:
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方法結束"); } }
微服務系列文章主要介紹微服務所使用到的一些技術和一些技術示例: