您的位置:首页 > 移动开发 > Unity3D

MVC中使用Unity AOP

2012-02-22 15:45 344 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: