AOP之PostSharp3-MethodInterceptionAspect

   在上两篇我们介绍了OnExceptionAspectOnMethodBoundaryAspect ,在这节我们将继续了解MethodInterceptionAspect,他为我们提供了关于方法处理的AOP切入,不同于OnMethodBoundaryAspect,他不是边界,是方法体。有了我们可以在我们的方法切入aspect很多有用的信息,比如将同步方法变为异步,防止多次点击重复提交,winform,wpf的多线程调用UI(参见PostSharp - Thread Dispatching(GUI多线程)),长时间操作在超过用户接受时间弹出进度条等等有用的关于用户体验和业务逻辑功能,简化我们的编程开发。

同样我们先来看看其MethodInterceptionAspect定义:

image

Invoke MethodInterceptionArgs参数:

image

我们一般使用Proceed是的方法进行处理。在这时我们可以加入线程池调用,使的其变为异步操作。

同时MethodInterceptionAspect 还继承了MethodLevelAspect 的CompileTimeValidate编译是验证,CompileTimeInitialize编译时初始化,RuntimeInitialize运行时初始化,后边的初始化我们将在后面一节PostSharp范围(static和instance中讲到)。

其定义很简单,在于我们的发挥:

二:防止多次提交处理demo:

我们这里只采用简单思路在方法进入禁止按钮可用,方法执行完成后恢复可用状态。我们将使监听winform事件处理方法,按钮来自EventHandle的第一个参数Sender。

[Serializable] 
     public  class UnMutipleTriggerAttribute : MethodInterceptionAspect 
    { 
       

public  override  bool CompileTimeValidate(System.Reflection.MethodBase method) 
       { 
            var ps = method.GetParameters(); 
            if (ps !=  null && ps.Count() >  0 && ps[ 0].Name ==  " sender "
                return  true
            return  false
       } 

         public  override  void OnInvoke(MethodInterceptionArgs args) 
        { 
             if (args.Arguments.Count >  0
            { 
                 var controls = args.Arguments[ 0as System.Windows.Forms.Control; 
                 if (controls !=  null && controls.Enabled) 
                { 
                    controls.Enabled =  false
                    args.Proceed(); ; 
                    controls.Enabled =  true
                } 
            } 

        } 
    }

在这里我们是监听方法的处理事件函数根据vs自动生成规则,第一个参数是sender,事件源,这里利用了CompileTimeValidate在编译时决定是否注入aspect。

注意这里只是一个简单的demo,只针对于同步操作,如要变为异步操作,这需要改为在异步操作后启用。

测试在button点击方法加上attribute:

[UnMutipleTriggerAttribute] 
         private  void Save( object sender, EventArgs e) 
        { 
            System.Threading.Thread.Sleep( 2000); 
        }

效果:

image

这个例子很简单的就完成了。

demo下载

参考:

AOP之PostSharp初见-OnExceptionAspect AOP之PostSharp2-OnMethodBoundaryAspect AOP之PostSharp3-MethodInterceptionAspect AOP之PostSharp4-实现类INotifyPropertyChanged植入 AOP之PostSharp5-LocationInterceptionAspect AOP之PostSharp6-EventInterceptionAspect http://www.cnblogs.com/whitewolf/category/312638.html  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值