调试拦截器模式

时间:2012-08-23 02:33:59

标签: c# ninject interceptor ninject-interception

我正在学习使用Interceptor模式和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);
    }
}

我在主方法中设置我的Ninject内核如下。

kernel = new StandardKernel();

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

问题在于,当调试对myClass的方法调用时,(我在myClass.methodName()之类的语句上设置了一个断点并按下F11),有很多堆栈帧要通过,之前我看到对Interceptor的调用,然后是实际的方法调用。

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

有没有办法告诉Visual Studio不要破坏Ninject堆栈帧? (无论如何,我没有Ninject来源)

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

1 个答案:

答案 0 :(得分:2)

在选项对话框中挖掘了4个小时并在Google上搜索了哪些certailn复选框(单个对话框有多复杂?)我找到了答案。

实际上,您可以告诉Visual Studio不要担心某些DLL或EXE,并在不破坏和请求源的情况下逐步执行它们。

这是怎么做的。

  1. 在visual studio中打开选项对话框。 (工具&gt;选项)
  2. 导航到调试&gt;符号部分
  3. 或在VS 2012+的右上角“快速启动”框中输入“符号”,然后按Enter键。

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

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

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

    3. 添加不关心的模块不想调试。
    4. ScreenCap http://i40.tinypic.com/2ecolqb.png

      就我而言,我必须添加

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

      基本上,这个对话框意味着'我不关心这些DLL。我在调试时只是忽略它们。

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

      此选项位于VS 2010和VS 2012中。如果您的版本较旧且需要此功能,则可能运气不佳。

      添加之后,所有'Step-Into'(F11)命令只会转到我写的代码,并且不会要求符号,或者要求我找到Ninject的源文件。在调用堆栈窗口中,来自这些程序集的所有堆栈帧组合成一行名为“[External Code]”。

      快乐编码。

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