在上一篇中我們了解了簡(jiǎn)單的OnExceptionAspectAOP面向方向切入,在第一節(jié)中我們將繼續(xù)我們的PostSharp AOP系列的OnMethodBoundaryAspect方法行為的切入,這也是我們常用的AOP切入。
裕民網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,裕民網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為裕民成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的裕民做網(wǎng)站的公司定做!
OnMethodBoundaryAspect顧名思義其為對(duì)方法邊界的切入,定義如下:
在這里提供了四個(gè)方法邊界點(diǎn)為我們切入。我們可以很輕松的對(duì)方法權(quán)限,執(zhí)行時(shí)間,參數(shù)合法性等aspect。
aspect傳入?yún)?shù)MethodExecutionArgs給我如下信息,同時(shí)還包括父類AdviceArgs的Instance屬性,實(shí)例方法才有值,靜態(tài)方法則為null,
這里還需要說(shuō)一下屬性FlowBehavior:表示方法執(zhí)行行為,是一個(gè)枚舉變量:
二:執(zhí)行時(shí)間統(tǒng)計(jì)demo
下面我們實(shí)踐一個(gè)方法執(zhí)行時(shí)間統(tǒng)計(jì)demo:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using PostSharp.Aspects;
- namespace PostSharpDemo
- {
- [Serializable]
- public class OnMethodBoundaryAspectDemoAttribute : OnMethodBoundaryAspect
- {
- public bool Enabled
- {
- get;
- set;
- }
- public override void OnEntry(MethodExecutionArgs args)
- {
- if (this.Enabled)
- {
- args.MethodExecutionTag = System.Diagnostics.Stopwatch.StartNew();
- }
- }
- public override void OnExit(MethodExecutionArgs args)
- {
- if (this.Enabled)
- {
- var sw = args.MethodExecutionTag as System.Diagnostics.Stopwatch;
- if (sw != null)
- {
- sw.Stop();
- Console.WriteLine(String.Format("方法{0}執(zhí)行時(shí)間為:{1}s", args.Method.Name, sw.ElapsedMilliseconds / 1000));
- sw = null;
- }
- }
- }
- }
- }
- [OnMethodBoundaryAspectDemoAttribute(Enabled=true)]
- public static void OnMethodBoundaryAspectDemoAttributeTest()
- {
- System.Threading.Thread.Sleep(2000);
- }
結(jié)果如下:
注:這里我們也可以用到我們上節(jié)說(shuō)的 多播(Multicasting)加到我們的class,assembly上統(tǒng)計(jì)我們所有的方法。
在最后在廢話一句,我們可以很輕松的指定我們的方法(比如使我們的wcf服務(wù)操作契約)的訪問(wèn)權(quán)限,比如基于操作權(quán)限的功能點(diǎn)function的處理,如[PowerAttribute(“Add,Edit”)]這樣簡(jiǎn)單處理,我們只需要在OnEnter中aspect,決定方法FlowBehavior行為,剩下的事情教給大家自己實(shí)踐。
歡迎大家積極指正和多多交流。
附件:demo下載
其他AOP參考: