我们正在基于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中忽略了一些东西,但我欢迎任何建议!
我想稍微改造代码,但是没有时间,虽然看起来很奇怪,但实际上我们的环路复杂性非常好。
答案 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();