2012-02-29 50 views
6

我們周圍4.0步進MVC迷你探查沒有嵌套usings

由於發展的性質我們已經實現一個倉庫風格的圖案,並有大量的動態CRM複雜的實體關係模型基於一個複雜的系統不同的提供者彼此相關。

我真正想要做的是分析他們的構造函數和各種懶惰的getter,但我想在最高級別對此進行建模。

問題是,當然,範圍 - 如果我將構造函數包裝在一個使用塊中,它不可用於其他任何東西。如果我擴展使用塊,以便引用我正在分析的對象的所有內容都進入範圍,那麼分析器不僅僅分析構造函數 - 它是對其他所有內容進行計時。

同樣,有一個嵌套級別,如果我正確嵌套使用,那麼代碼變得不可讀。

我已經看過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中忽略一些東西,但我歡迎任何建議!

我想重新編碼一下,但沒有時間,雖然看起來很奇怪,但我們確實有一個相當不錯的圈複雜度。

回答

7

是的,這是可能的。而不是使用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(); 
+2

輝煌,謝謝! – 2012-02-29 15:00:44

+0

請注意,如果MiniProfiler未啓動,那麼executionStep將爲空,因此您需要「if(executionStep!= null)executionStep.Dispose()」。 – eddiegroves 2015-01-30 05:18:34