我使用 StructureMap 来创建一个接口实例,然后用 Castle DynamicProxy 将其包装到代理中:
var proxy = generator.CreateInterfaceProxyWithTarget<T>(
ObjectFactory.GetInstance<T>()
, new SwitchInterceptor(isGranted, foundUser));
在IInterceptor
类型的拦截器中,我已经得到了这段代码:
public override void Intercept(IInvocation invocation)
{
if (this.CanExecute)
{
invocation.Proceed();
}
}
当CanExecute为true
时,它始终有效,但有时当CanExecute为false
时,我有一个奇怪的NullReferenceException
,真的很小堆栈跟踪:
at Castle.Proxies.IGrantedReadProxy.ExecuteSomething()
我真的迷路了,我不知道在哪里看。你对这个问题有什么想法吗?
答案 0 :(得分:2)
我认为问题是返回类型是不可为空的值类型(例如int
)。在这种情况下,null
具有的invocation
的默认返回值不适用。你也不要通过调用invocation.Proceed()
来设置它,所以你必须以另一种方式设置它。
在这些情况下,您必须明确设置invocation.ReturnValue
。另一个选择是抛出一个更具信息性的例外。