我正在学习使用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不要破坏我没有源代码的代码...
答案 0 :(得分:2)
在选项对话框中挖掘了4个小时并在Google上搜索了哪些certailn复选框(单个对话框有多复杂?)我找到了答案。
实际上,您可以告诉Visual Studio不要担心某些DLL或EXE,并在不破坏和请求源的情况下逐步执行它们。
这是怎么做的。
或在VS 2012+的右上角“快速启动”框中输入“符号”,然后按Enter键。
在右下角,选择“除非排除所有模块”
单击该链接并指定要排除的DLL或EXE。
ScreenCap http://i40.tinypic.com/2ecolqb.png
就我而言,我必须添加
Ninject.dll
Ninject.Extensions.Interception.dll
Ninject.Extensions.Interception.DynamicProxy.dll
基本上,这个对话框意味着'我不关心这些DLL。我在调试时只是忽略它们。
好像你只需要EXE或DLL名称,而不是整个路径。它似乎不区分大小写。
此选项位于VS 2010和VS 2012中。如果您的版本较旧且需要此功能,则可能运气不佳。
添加之后,所有'Step-Into'(F11)命令只会转到我写的代码,并且不会要求符号,或者要求我找到Ninject的源文件。在调用堆栈窗口中,来自这些程序集的所有堆栈帧组合成一行名为“[External Code]”。
快乐编码。
我希望这会让你的生活更轻松。