PostSharp 应用小结

PostSharp 使用IL静态注入实现AOP,

下面例子对登录操作进行静态注入,使用Web application ,记录每次登录

PostSharp的使用方法很简单,将自定义的属性 LoggerTrace直接加在需要注册的方法上就可以(事件是特殊的方法)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PostSharpLogger;
namespace PostSharpWebForm.Account
{
    public partial class Login : Page
    {

        [LoggerTrace]
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                RegisterHyperLink.NavigateUrl = "Register";
                OpenAuthLogin.ReturnUrl = Request.QueryString["ReturnUrl"];

                var returnUrl = HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]);
                if (!String.IsNullOrEmpty(returnUrl))
                {
                    RegisterHyperLink.NavigateUrl += "?ReturnUrl=" + returnUrl;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                Response.Write("Hi ^<>^");
            }
        }

        protected void Page_Load2(object sender, EventArgs e)
        {
            RegisterHyperLink.NavigateUrl = "Register";
            OpenAuthLogin.ReturnUrl = Request.QueryString["ReturnUrl"];

            var returnUrl = HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]);
            if (!String.IsNullOrEmpty(returnUrl))
            {
                RegisterHyperLink.NavigateUrl += "?ReturnUrl=" + returnUrl;
            }
        }
    }
}

下面是 创建的自定义属性,具体用法可以查看PostSharp的文档

using PostSharp.Aspects;
using System;

namespace PostSharpLogger
{
    [Serializable]
    public class LoggerTraceAttribute : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
            WriteLog.Log(string.Format("Before Entering {0}.{1}.", args.Method.DeclaringType.FullName, args.Method.Name));
            args.ReturnValue = "I‘m onEntry";

        }
        public override void OnSuccess(MethodExecutionArgs args)
        {
            WriteLog.Log(string.Format("Before Entering {0}.{1}.", args.Method.DeclaringType.FullName, args.Method.Name));
        }
        public override void OnExit(MethodExecutionArgs args)
        {
            WriteLog.Log(string.Format(" After Entering {0}.{1}.", args.Method.DeclaringType.FullName, args.Method.Name));
            args.ReturnValue = args.MethodExecutionTag;
            args.FlowBehavior = FlowBehavior.Return;
        }

        public override void OnException(MethodExecutionArgs args)
        {
            WriteLog.Log(string.Format("Error Entering {0}.{1}.", args.Method.DeclaringType.FullName, args.Method.Name));
        }
    }
}

编译Web application 之后,使用  ILSpy查看 Web application的DLL

被注入的方法编译后变成:

using PostSharp.Aspects;
using PostSharp.Aspects.Internals;
using PostSharp.ImplementationDetails_c77a9d44;
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace PostSharpWebForm.Account
{
	public class Login : Page
	{
		protected HyperLink RegisterHyperLink;
		protected OpenAuthProviders OpenAuthLogin;
		protected void Page_Load(object sender, EventArgs e)
		{
			MethodExecutionArgs methodExecutionArgs = new MethodExecutionArgs(this, new Arguments<object, EventArgs>
			{
				Arg0 = sender,
				Arg1 = e
			});
			MethodExecutionArgs arg_27_0 = methodExecutionArgs;
			MethodBase  = <>z__a_1._1;
			arg_27_0.Method = ;
			<>z__a_1.a0.OnEntry(methodExecutionArgs);
			if (methodExecutionArgs.FlowBehavior != FlowBehavior.Return)
			{
				try
				{
					try
					{
						this.RegisterHyperLink.NavigateUrl = "Register";
						this.OpenAuthLogin.ReturnUrl = base.Request.QueryString["ReturnUrl"];
						string returnUrl = HttpUtility.UrlEncode(base.Request.QueryString["ReturnUrl"]);
						if (!string.IsNullOrEmpty(returnUrl))
						{
							HyperLink expr_A4 = this.RegisterHyperLink;
							expr_A4.NavigateUrl = expr_A4.NavigateUrl + "?ReturnUrl=" + returnUrl;
						}
					}
					catch (Exception)
					{
						throw;
					}
					finally
					{
						base.Response.Write("Hi ^<>^");
					}
					<>z__a_1.a0.OnSuccess(methodExecutionArgs);
				}
				catch (Exception exception)
				{
					methodExecutionArgs.Exception = exception;
					<>z__a_1.a0.OnException(methodExecutionArgs);
					switch (methodExecutionArgs.FlowBehavior)
					{
					case FlowBehavior.Default:
					case FlowBehavior.RethrowException:
						IL_11E:
						throw;
					case FlowBehavior.Continue:
						methodExecutionArgs.Exception = null;
						return;
					case FlowBehavior.Return:
						methodExecutionArgs.Exception = null;
						return;
					case FlowBehavior.ThrowException:
						throw methodExecutionArgs.Exception;
					}
					goto IL_11E;
				}
				finally
				{
					<>z__a_1.a0.OnExit(methodExecutionArgs);
				}
			}
		}
		protected void Page_Load2(object sender, EventArgs e)
		{
			this.RegisterHyperLink.NavigateUrl = "Register";
			this.OpenAuthLogin.ReturnUrl = base.Request.QueryString["ReturnUrl"];
			string returnUrl = HttpUtility.UrlEncode(base.Request.QueryString["ReturnUrl"]);
			if (!string.IsNullOrEmpty(returnUrl))
			{
				HyperLink expr_5F = this.RegisterHyperLink;
				expr_5F.NavigateUrl = expr_5F.NavigateUrl + "?ReturnUrl=" + returnUrl;
			}
		}
		[CompilerGenerated]
		static Login()
		{
			<>z__a_1.Initialize();
		}
	}
}

  原有的方法被加载一个try catch 中

PostSharp 应用小结

时间: 2024-10-09 22:56:00

PostSharp 应用小结的相关文章

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

【转载】小结一下linux 2.6内核的四种IO调度算法

在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation.该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作.之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求.NOOP假定I/O请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样).在有些SAN环境下,这个选择可能是最好选择.Noop 对于 IO

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

安卓小结《1》

Activity的生命周期和启动模式的知识点小结: 1.如果Activity切换的时候,新Activity是透明,旧的不会走onStop方法. 2.新的Activity切换的时候,旧Activity  会先执行,onpause,然后才会启动新的activity. 3. Activity在异常情况下被回收时,onSaveInstanceState方法会被回调,回调时机是在onStop之前,当Activity被重新创建的时 候,onRestoreInstanceState方法会被回调,时序在onSt

date命令小结

在写linux shell脚本时,date是经常要用到的一个命令,这篇文章就此做个小结,以防自己用到时到处找 1.最基本的,显示当前的具体时期:直接敲入 date即可,如下, [email protected]:~/scripts$ date 2015年 01月 03日 星期六 21:46:49 CST 2.显示某个文件上次修改的时间:date -r file [email protected]:~/scripts$ date -r save.sh 2015年 01月 02日 星期五 23:29

java 小结2 多态问题。

面向对象这个东西,其实我们一直是不是都没有感觉到自己在用,以后我一定要用用.以前学c#时候认真的看过一次,最近一直研究java.随便再看看. 多态问题: 在java中多态分为(1)编译时多态和(2)运行时多态 (1)编译时多态比较容易理解:其实就是通过方法重载,就是方法的重载,同一个函数名但是可以参数不一样.这就是重载(so easy) (2)运行时多态:这个是通过方法覆盖实现的,就是子类在继承父类的时候,通过对某个方法的重写,覆盖父类方法. 简单的说:比如我们有个父类A,子类B通过Extend

php操作xml小结

<?php #php操作xml,SimpleXMLElement类小结 header('Content-type:text/html;charset=utf-8;'); //1.构造函数 /* $xmlstring=<<<XML <?xml version="1.0" encoding="utf-8"?> <note  xmlns:b="http://www.w3school.com.cn/example/&quo

网络安全解决之个人小结

方案分为安全技术部分和安全管理部分. 安全技术部分: 1.物理安全 需要建设独立的计算机机房,满足防水.防火.防静电等要求.机房设置门禁和视频监控. 2.网络安全 采用防火墙进行安全区域分割,把公司网络分为服务器区和办公区.设置不同的安全规则以防范黑客攻击.采用上网行为管理产品对网络行为和流量进行管控. 3.系统安全 采用终端安全管理系统,对客户端进行管控,重点管控网络行为.补丁升级和软件分发等.对服务器进行安全加固,保障服务器安全. 4.应用安全 对Web电子商务服务器进行漏洞扫描和加固,防范