正在获取有关Ninject截获的方法的信息
本文关键字:方法 信息 Ninject 获取 | 更新日期: 2023-09-27 18:24:15
我正在使用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
给了我接口的名称,如何获得真正的实现类的名称是否有获取参数值的方法我可以使用
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.cshttps://github.com/ninject/ninject.extensions.interception/blob/master/src/Ninject.Extensions.Interception/Request/IProxyRequest.cs
有办法得到参数值吗?我可以得到参数使用调用的名称。Request.Method.GetParameters,但我没有找到了一种获得实际值的方法
对于参数,我创建了一个小助手,它将为您提供与值映射的参数名称,然后可以将其转换为dictionary。
private IEnumerable<KeyValuePair<string, object>> MapParameters(object[] arguments, ParameterInfo[] getParameters)
{
for (int i = 0; i < arguments.Length; i++)
{
yield return new KeyValuePair<string, object>(getParameters[i].Name, arguments[i]);
}
}
用法如下:
var mappedParameters = MapParameters(invocation.Arguments, invocation.Method.GetParameters())
.ToDictionary(x => x.Key, x => x.Value?.ToString());
示例
方法签名:获取(int id)
用法:获取(1)
输出:{[id,1]}