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

时间:2013-07-20 17:52:29

标签: c# asp.net ninject aop castle-dynamicproxy

我正在使用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方法,但是有没有办法让它在非空方法上工作,提供一个默认值作为结果?说我有一个bool DoSomething(..),当它失败时有异常我希望它看起来像返回false的方法。

2 个答案:

答案 0 :(得分:6)

你在谈论Ninject,但我认为你只对Castle Dynamic Proxy的功能感兴趣,并IInvocation你的意思是Castle.DynamicProxy.IInvocation

  1. invocation.TargetType.Name
  2. invocation.Arguments
  3. invocation.ReturnValue - 您可以在发生异常时进行设置
  4. 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
    4. 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

答案 1 :(得分:2)

  

有没有办法获得参数值?我可以得到参数   使用invocation.Request.Method.GetParameters的名字,但我没有   找到了获得实际值的方法

对于参数我创建了一个小帮助器,它将为您提供与值映射的参数名称,然后可以将其转换为字典。

    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]}