遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

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);
    }
}

 

posted on 2012-02-22 15:45  遗忘海岸  阅读(1039)  评论(0编辑  收藏  举报