AOP之PostSharp3-MethodInterceptionAspect
2011-12-04 23:46 破狼 阅读(3161) 评论(0) 编辑 收藏 举报在上两篇我们介绍了OnExceptionAspect和OnMethodBoundaryAspect ,在这节我们将继续了解MethodInterceptionAspect,他为我们提供了关于方法处理的AOP切入,不同于OnMethodBoundaryAspect,他不是边界,是方法体。有了我们可以在我们的方法切入aspect很多有用的信息,比如将同步方法变为异步,防止多次点击重复提交,winform,wpf的多线程调用UI(参见PostSharp - Thread Dispatching(GUI多线程)),长时间操作在超过用户接受时间弹出进度条等等有用的关于用户体验和业务逻辑功能,简化我们的编程开发。
同样我们先来看看其MethodInterceptionAspect定义:
Invoke MethodInterceptionArgs参数:
我们一般使用Proceed是的方法进行处理。在这时我们可以加入线程池调用,使的其变为异步操作。
同时MethodInterceptionAspect 还继承了MethodLevelAspect 的CompileTimeValidate编译是验证,CompileTimeInitialize编译时初始化,RuntimeInitialize运行时初始化,后边的初始化我们将在后面一节PostSharp范围(static和instance中讲到)。
其定义很简单,在于我们的发挥:
二:防止多次提交处理demo:
我们这里只采用简单思路在方法进入禁止按钮可用,方法执行完成后恢复可用状态。我们将使监听winform事件处理方法,按钮来自EventHandle的第一个参数Sender。
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[0] as System.Windows.Forms.Control;
if (controls != null && controls.Enabled)
{
controls.Enabled = false;
args.Proceed(); ;
controls.Enabled = true;
}
}
}
}
在这里我们是监听方法的处理事件函数根据vs自动生成规则,第一个参数是sender,事件源,这里利用了CompileTimeValidate在编译时决定是否注入aspect。
注意这里只是一个简单的demo,只针对于同步操作,如要变为异步操作,这需要改为在异步操作后启用。
测试在button点击方法加上attribute:
private void Save(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(2000);
}
效果:
这个例子很简单的就完成了。
参考:
作者:破 狼
出处:http://www.cnblogs.com/whitewolf/
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客、博客园--破狼和51CTO--破狼。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架