我正在使用 Ninject 拦截来记录我的某些方法的错误。我的拦截类看起来像这样
public class ErrorLoggingInterceptor : IInterceptor
{
private readonly ILogFactory _logFactory;
public ErrorLoggingInterceptor(ILogFactory logFactory)
{
_logFactory = logFactory;
}
public void Intercept(IInvocation invocation)
{
try
{
invocation.Proceed();
}
catch (Exception e)
{
var sb = new StringBuilder();
sb.AppendFormat("Executing {0}.{1} ",invocation.Request.Method.DeclaringType.Name,invocation.Request.Method.Name);
sb.AppendFormat(" {0} caught: {1})", e.GetType().Name, e.Message);
_logFactory.Error(sb.ToString());
}
}
}
这个拦截器类工作得很好,但我遇到了一些问题。
invocation.Request.Method.DeclaringType.Name
给我接口(interface)的名字,如何得到真正实现类的名字?有没有办法获取参数值?我可以使用
invocation.Request.Method.GetParameters
获取参数名称,但我没有找到获取实际值的方法- 我的拦截器旨在“吞噬”异常。它适用于 void 方法,但有没有办法使其适用于提供默认值作为结果的非 void 方法?假设我有一个
bool DoSomething(..)
,当它因异常而失败时,我希望它看起来像返回 false 的方法。
最佳答案
你说的是 Ninject,但我假设你只对 CaSTLe Dynamic Proxy 的特性感兴趣,IInvocation
你的意思是 CaSTLe.DynamicProxy.IInvocation
。
invocation.TargetType.Name
invocation.Arguments
invocation.ReturnValue
- 你可以在异常发生时设置它
https://github.com/castleproject/Core/blob/master/src/Castle.Core/DynamicProxy/IInvocation.cs
当谈到 Ninject 扩展时,我会期待类似的东西(但是,我从未使用过它):
invocation.Request.Target.GetType().Name
invocation.Request.Arguments
invocation.ReturnValue
https://github.com/ninject/ninject.extensions.interception/blob/master/src/Ninject.Extensions.Interception/IInvocation.cs https://github.com/ninject/ninject.extensions.interception/blob/master/src/Ninject.Extensions.Interception/Request/IProxyRequest.cs
关于c# - 获取有关 Ninject 拦截的方法的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17765010/