c# - 获取有关 Ninject 拦截的方法的信息

标签 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 给我接口(interface)的名字,如何得到真正实现类的名字?

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

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

最佳答案

你说的是 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.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/

相关文章:

binding - 多个命名范围中需要的 NInject 服务

c# - NInject 扩展工厂

c# - global_asax 在命名空间 ASP 中不存在

asp.net - 将输入值从 View 传递给 MVC 中的 id

asp.net - SQL Server 不会打开 Visual Studio 创建的数据库

c# - 如何在 C# 中的代码后面获取 javascript 值

xamarin - Ninject StandardKernel System.ArgumentNullException : value cannot be null. 参数名称:path1

c# - 如何将多个文件添加到播放列表

c# - 如何基于 Func<T> 将 IObservable<T> 窗口化/缓冲到 block 中

c# - 将 XMLDocument 写入具有特定换行符的文件 (c#)