• MVC中使用Unity AOP


    Unity AOP支持,透明代码,接口方式,与Virtual 方法, 由于透明代理必须继承MarshalByRefObject,接口方式使用Unity构建时,只能按接口获取

    Container.Resolve(IXXX),  在让标记接口继承IController(Filter正常)后发现Unity无法拦截到,最后只有Virtal方法方式可以形, Virtual方式的拦截器会在Filter执行后执行,Virtaul方法编织进AOP代码后取代了原来的Controll方法

    基于虚方法方式,Unity生成的代理类,该方式属于类型拦截,不存在拦截(代理)实例到目标实例(target)的引用

    public class Wrapped_Home_273249ec14ea46568e66523bd7e6877c : Home, IInterceptingProxy
    {
        // Fields
        private readonly InterceptionBehaviorPipeline pipeline = new InterceptionBehaviorPipeline();
    
        // Methods
        [CompilerGenerated]
        private IMethodReturn <Index_DelegateImplementation>__0(IMethodInvocation inputs, GetNextInterceptionBehaviorDelegate getNext)
        {
            try
            {
                int returnValue = base.Index();
                return inputs.CreateMethodReturn(returnValue, new object[0]);
            }
            catch (Exception exception)
            {
                return inputs.CreateExceptionMethodReturn(exception);
            }
        }
    
        public override int Index()
        {
            VirtualMethodInvocation input = new VirtualMethodInvocation(this, methodof(Home.Index), new object[0]);
            IMethodReturn return2 = this.pipeline.Invoke(input, new InvokeInterceptionBehaviorDelegate(this.<Index_DelegateImplementation>__0));
            Exception exception = return2.Exception;
            if (exception != null) throw exception;
            return (int) return2.ReturnValue;
        }
    
        void IInterceptingProxy.AddInterceptionBehavior(IInterceptionBehavior interceptor)
        {
            this.pipeline.Add(interceptor);
        }
    }
    

    基于接口方式,Unity生成的代理类--注意接口方式(InterfaceInterceptor)跟透明代理(TransparentProxyInterceptor)一样都是实例拦截器

    public class Wrapped_IHome_ff5a91d8f8b1447c924a45e62dcb89e8 : IInterceptingProxy, IHome
    {
        // Fields
        private readonly InterceptionBehaviorPipeline pipeline = new InterceptionBehaviorPipeline();
        private IHome target;
        private Type typeToProxy;
    
        // Methods
        public Wrapped_IHome_ff5a91d8f8b1447c924a45e62dcb89e8(IHome target, Type typeToProxy)
        {
            this.target = target;
            this.typeToProxy = typeToProxy;
        }
    
        [CompilerGenerated]
        private IMethodReturn <Index_DelegateImplementation>__0(IMethodInvocation inputs, GetNextInterceptionBehaviorDelegate getNext)
        {
            try
            {
                int returnValue = this.target.Index();
                return inputs.CreateMethodReturn(returnValue, new object[0]);
            }
            catch (Exception exception)
            {
                return inputs.CreateExceptionMethodReturn(exception);
            }
        }
    
        public int Index()
        {
            VirtualMethodInvocation input = new VirtualMethodInvocation(this.target, methodof(IHome.Index), new object[0]);
            IMethodReturn return2 = this.pipeline.Invoke(input, new InvokeInterceptionBehaviorDelegate(this.<Index_DelegateImplementation>__0));
            Exception exception = return2.Exception;
            if (exception != null) throw exception;
            return (int) return2.ReturnValue;
        }
    
        void IInterceptingProxy.AddInterceptionBehavior(IInterceptionBehavior interceptor)
        {
            this.pipeline.Add(interceptor);
        }
    }
    
     
    

    基于接口的动态生成类

      public interface IAOP:IController
        {
            ActionResult Index();
        }
    

     下面代码中pipeline中只有一个元素那就是PolicyInjectionBehavior,而PolicyInjectionBehavior里面又根据调用的方法来维护一组ICallHandler管道

    public class Wrapped_IHome_fa19b49db3a345b28531be422717e4e7 : IInterceptingProxy, IHome, IController
    {
        // Fields
        public readonly InterceptionBehaviorPipeline pipeline = new InterceptionBehaviorPipeline();
        private IHome target;
        private Type typeToProxy;
    
        // Methods
        public Wrapped_IHome_fa19b49db3a345b28531be422717e4e7(IHome target, Type typeToProxy)
        {
            this.target = target;
            this.typeToProxy = typeToProxy;
        }
    
        [CompilerGenerated]
        private IMethodReturn <Execute_DelegateImplementation>__1(IMethodInvocation inputs, GetNextInterceptionBehaviorDelegate getNext)
        {
            try
            {
                this.target.Execute();
                return inputs.CreateMethodReturn(null, new object[0]);
            }
            catch (Exception exception)
            {
                return inputs.CreateExceptionMethodReturn(exception);
            }
        }
    
        [CompilerGenerated]
        private IMethodReturn <Index_DelegateImplementation>__0(IMethodInvocation inputs, GetNextInterceptionBehaviorDelegate getNext)
        {
            try
            {
                int returnValue = this.target.Index();
                return inputs.CreateMethodReturn(returnValue, new object[0]);
            }
            catch (Exception exception)
            {
                return inputs.CreateExceptionMethodReturn(exception);
            }
        }
    
        public void Execute()
        {
            VirtualMethodInvocation input = new VirtualMethodInvocation(this.target, methodof(IController.Execute), new object[0]);
            Exception exception = this.pipeline.Invoke(input, new InvokeInterceptionBehaviorDelegate(this.<Execute_DelegateImplementation>__1)).Exception;
            if (exception != null) throw exception;
        }
    
        public int Index()
        {
            VirtualMethodInvocation input = new VirtualMethodInvocation(this.target, methodof(IHome.Index), new object[0]);
            IMethodReturn return2 = this.pipeline.Invoke(input, new InvokeInterceptionBehaviorDelegate(this.<Index_DelegateImplementation>__0));
            Exception exception = return2.Exception;
            if (exception != null) throw exception;
            return (int) return2.ReturnValue;
        }
    
        void IInterceptingProxy.AddInterceptionBehavior(IInterceptionBehavior interceptor)
        {
            this.pipeline.Add(interceptor);
        }
    }
    
  • 相关阅读:
    shell入门-cut命令
    shell入门-特殊符号
    shell入门-系统和用户的配置文件
    shell入门-变量
    shell入门-shell特性
    linux命令-yum工具详解
    linux命令-rpm查询包
    linux命令-rpm安装和卸载
    math 数学模块
    random 随机模块
  • 原文地址:https://www.cnblogs.com/wdfrog/p/2363260.html
Copyright © 2020-2023  润新知