c# - 调试拦截器模式

标签 c# ninject interceptor ninject-interception

我正在学习在 Ninject 中使用拦截器模式。

我有一个拦截器如下。

public class MyInterceptor:IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("Pre Execute: " + invocation.Request.Method.Name);

        invocation.Proceed();

        Console.WriteLine("Post Execute: " + invocation.Request.Method.Name);
        Console.WriteLine("Returned: " + invocation.ReturnValue);
    }
}

我在我的 Main 方法中设置我的 Ninject 内核,如下所示。

kernel = new StandardKernel();

kernel.Bind<MyClass>().ToSelf().Intercept().With(new MyInterceptor());
myClass = kernel.Get<MyClass>();

问题是,在调试对 myClass 的方法调用时,(我在 myClass.methodName() 之类的语句上放置一个断点并按 F11)在我看到对我的拦截器的调用之前,有很多堆栈帧要传递,然后是实际的方法调用。

我确实意识到 Ninject 创建了动态代理等。在幕后,但这让事情变得有点困难,如果我想查看我的代码流,从所有拦截器到实际方法。 (想象一下调试看是哪个拦截器阻塞了一个方法调用)

有没有办法告诉 Visual Studio 不要中断 Ninject 堆栈帧? (反正我没有 Ninject 源代码)

更新 本质上,我想做的是告诉 VS 不要破坏我没有源代码的代码......

最佳答案

在选项对话框中仔细研究了 4 个小时并在 Google 上搜索了某些复选框的功能(单个对话框可以制作多复杂?)后,我找到了答案。

实际上,您可以告诉 Visual Studio 不要担心某些 DLL 或 EXE,并在不中断和询问源代码的情况下单步“通过”它们。

这是如何做到的。

  1. 在 Visual Studio 中打开选项对话框。 (工具 > 选项)
  2. 导航到“调试”>“符号”部分

或在 VS 2012+ 的右上角“快速启动”框中键入“符号”,然后按回车键。

  1. 在右下角,选择“所有模块,除非排除”

    ScreenCap http://i40.tinypic.com/10gaedt.png

  2. 单击链接并指定要排除的 DLL 或 EXE。

  3. 添加您不关心不想调试的模块。

ScreenCap

就我而言,我必须添加

  • Ninject.dll
    • 注入(inject)核心 DLL
  • Ninject.Extensions.Interception.dll
    • 这是 Ninject 拦截模块
  • Ninject.Extensions.Interception.DynamicProxy.dll
    • 我使用动态代理实现拦截模块,而不是 LinFu 实现。我也不想调试它。

从本质上讲,此对话框的意思是,“我不关心这些 DLL。在我调试时忽略它们'。

似乎您只需要 EXE 或 DLL 名称,而不是整个路径。而且好像不区分大小写。

这个选项在 VS 2010 和 VS 2012 中。如果你有一个旧版本并且需要这个功能,你可能不走运。

添加这个之后,所有“Step-Into”(F11) 命令只针对我编写的代码,不要求符号,也不要求我为 Ninject 定位源文件。在调用堆栈窗口中,这些程序集中的所有堆栈帧都合并到一行,名为“[外部代码]”。

快乐编码。

我希望这能让您的生活更轻松。

关于c# - 调试拦截器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12083988/

相关文章:

c# - 如何在声明本身中初始化泛型?

c# - C# 中的 DateTime 已过去?

java - EJB 上基于注释的拦截器

c# - 关于使用 Ninject 的问题

hadoop - 在发送到 channel 之前删除空的 Flume 事件

jsf - JSF 中的拦截器

c# - 列表框在 SelectedIndexChanged 事件上返回空字符串

c# - 为什么这个异步方法上的同步包装器有效?

asp.net-mvc-4 - HttpContextBase 如何向 ninject 注册?我没有明确绑定(bind)它

c# - Ninject 内核绑定(bind)覆盖