2012-02-29 23 views
6

Stiamo modellazione di un complicato sistema basato su una complessa relazione entità Dynamics CRM 4.0Stepping MVC Mini Profiler senza usings annidati

A causa della natura dello sviluppo abbiamo dovuto implementare un modello di stile repository e hanno un sacco di diversi fornitori che si riferiscono l'uno all'altro.

Quello che voglio veramente fare è profilare i loro costruttori e vari gettatori pigri, ma voglio modellarlo al livello più alto possibile.

Il problema è, naturalmente, Scope - Se avvolgo il costruttore in un blocco using, non è disponibile per nient'altro. Se estendo il blocco using in modo che tutto ciò che fa riferimento all'oggetto che sto profilando rientri nel campo di applicazione, allora il profiler non sta solo profilando il costruttore, ma sta calcolando tutto il resto.

Analogamente, c'è un livello di annidamento, Se annullo correttamente gli usi, il codice diventa illeggibile.

Ho dato un'occhiata a Profiler.Inline ma questo non serve ai miei scopi.

Quello che mi piacerebbe veramente fare è questo:

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); 

Ha senso? Spero di trascurare qualcosa in Mini Profiler, ma sarei felice di ricevere qualche suggerimento!

Mi piacerebbe rimodellare il codice un po ', ma non c'è tempo per quello e mentre sembra strano, in realtà abbiamo una complessità ciclomatica piuttosto buona.

risposta

7

Sì, questo è possibile. Invece di usare lo using basta usare "MiniProfiler.Current.Step (" blah ")". Ciò restituirà un oggetto che implementa IDisposeable. Quando l'oggetto è effettivamente smaltito è quando i tempi si fermeranno. Puoi persino annidare le cose con le affermazioni using come normali.

Esempio:

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

Brillante, grazie! –

+0

Nota che se MiniProfiler non è avviato, executingStep sarà nullo, quindi avrai bisogno di "if (executingStep! = Null) executingStep.Dispose()" per questo caso. – eddiegroves