没有嵌套使用的步进MVC Mini Profiler

时间:2012-02-29 11:05:19

标签: c# crm dynamics-crm-4 mvc-mini-profiler

我们正在基于Dynamics CRM 4.0中复杂的实体关系建模一个复杂的系统

由于开发的性质,我们必须实现一个存储库样式模式,并且有许多不同的提供者彼此相关。

我真正想要做的是描述他们的构造函数和各种懒惰的getter,但我想在顶层建模。

问题当然是Scope - 如果我将构造函数包装在using块中,它就不可用于其他任何东西。如果我扩展using块,以便引用我正在分析的对象的所有内容都进入范围,那么分析器不仅仅是对构造函数进行分析 - 它是其他所有内容的时间。

同样,有一定程度的嵌套,如果我正确嵌套使用,那么代码就变得不可读了。

我看过Profiler.Inline,但这不符合我的目的。

我真正想做的是:

ref = Profiler.StartStep("Creating CRM Model");
//Do horrible CRM work
var myNewHorribleObject = CRM.ModelHorribleStuff(...);
Profiler.StopStep(ref);

ref = Profiler.StartStep("How long does it take to get X");
var data = Repository.GetSomething(myNewHorribleObject.SomeId);
Profiler.StopStep(ref);

ref = Profiler.StartStep("How long does it take to get Y");
var newData = Repository.GetSomethingElse(myNewHorribleObject.ContextId);
Profiler.StopStep(ref);

这有意义吗?希望我在Mini Profiler中忽略了一些东西,但我欢迎任何建议!

我想稍微改造代码,但是没有时间,虽然看起来很奇怪,但实际上我们的环路复杂性非常好。

1 个答案:

答案 0 :(得分:9)

是的,这是可能的。而不是使用using只使用“MiniProfiler.Current.Step(”blah“)”。这将返回一个实现IDisposeable的对象。当实际处理该对象时,时间将停止。您甚至可以像平常一样使用using语句嵌套。

示例:

 IDisposable executingStep;
 executingStep= MiniProfiler.Current.Step("Some code after this");
 // do long code
 Thread.Sleep(100);
 using (profiler.Step("Step 2313"))
 {
     Thread.Sleep(100);
 }
 executingStep.Dispose();