正在获取有关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());
        }
    }
}

这个拦截器类工作得很好,但我遇到了一些问题。

  1. invocation.Request.Method.DeclaringType.Name给了我接口的名称,如何获得真正的实现类的名称

  2. 是否有获取参数值的方法我可以使用invocation.Request.Method.GetParameters获取参数名称,但我没有找到获取实际值的方法

  3. 我的拦截器旨在"吞下"异常。它适用于void方法,,但有没有办法使它适用于提供默认值的非void方法假设我有一个bool DoSomething(..),当它异常失败时,我希望它看起来像返回false的方法

正在获取有关Ninject截获的方法的信息

您说的是Ninject,但我认为您只对Castle Dynamic Proxy的功能感兴趣,而IInvocation指的是Castle.DynamicProxy.IInvocation

  1. invocation.TargetType.Name
  2. invocation.Arguments
  3. invocation.ReturnValue-发生异常时可以设置

https://github.com/castleproject/Core/blob/master/src/Castle.Core/DynamicProxy/IInvocation.cs

当谈到Ninject扩展时,我希望有类似的东西(然而,我从未使用过它):

  1. invocation.Request.Target.GetType().Name
  2. invocation.Request.Arguments
  3. 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]}