3

我正在学习将拦截器模式与 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 Method 中设置我的 Ninject 内核,如下所示。

kernel = new StandardKernel();

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

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

我确实意识到 Ninject 创建了 Dynamic Proxies .etc。在幕后,但这使事情变得更加困难,如果我想查看我的代码流程,从所有拦截器到实际方法。(想象一下调试以查看哪个拦截器阻塞了方法调用)

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

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

4

1 回答 1

2

在选项对话框中挖掘了 4 个小时并在 Google 上搜索某些复选框的作用(单个对话框可以有多复杂?)后,我找到了答案。

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

这是如何做到的。

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

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

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

    屏幕截图 http://i40.tinypic.com/10gaedt.png

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

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

屏幕截图

就我而言,我必须添加

  • Ninject.dll
    • Ninject 核心 DLL
  • Ninject.Extensions.Interception.dll
    • 这是忍者拦截模块
  • Ninject.Extensions.Interception.DynamicProxy.dll
    • 我使用动态代理实现拦截模块,而不是 LinFu 实现。我也不想调试这个。

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

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

此选项在 VS 2010 和 VS 2012 中。如果您有旧版本并需要此功能,您可能会不走运。

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

快乐编码。

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

于 2012-08-23T08:51:57.347 回答