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