zoukankan      html  css  js  c++  java
  • 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 中

  • 相关阅读:
    Golang使用os/exec时产生僵尸(defunct)进程
    golang channel 用法总结
    Git常用方法
    插入排序,冒泡排序,快速排序,选择排序,归并排序 C++代码实现
    Linux 系统安装golang
    Linux 压缩解压常用命令汇总
    云主机挂载硬盘
    Linux服务器如何修改内核版本号
    关于FreePBX语音网关对接遇到的伤心事
    Asterisk13.23.1如何增加G723编码和G729编码
  • 原文地址:https://www.cnblogs.com/2zhyi/p/3836016.html
Copyright © 2011-2022 走看看