我正在学习在 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,并在不中断和询问源代码的情况下单步“通过”它们。
这是如何做到的。
- 在 Visual Studio 中打开选项对话框。 (工具 > 选项)
- 导航到“调试”>“符号”部分
或在 VS 2012+ 的右上角“快速启动”框中键入“符号”,然后按回车键。
在右下角,选择“所有模块,除非排除”
单击链接并指定要排除的 DLL 或 EXE。
添加您
不关心不想调试的模块。
就我而言,我必须添加
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/