2012-02-29 12 views
6

Estamos modelando un complicado sistema basado en torno a una entidad relación complicada en Dynamics CRM 4.0Stepping MVC Mini Profiler sin usings anidados

Debido a la naturaleza del desarrollo que hemos tenido que implementar un modelo del estilo del repositorio y tienen un montón de diferentes proveedores que se relacionan entre sí.

Lo que realmente quiero hacer es crear un perfil de sus constructores y varios getters perezosa, pero quiero modelar esto en el nivel superior posible.

El problema es, por supuesto, Ámbito: si envuelvo el constructor en un bloque de uso, no está disponible para nada más. Si extiendo el bloque de uso para que todo lo que hace referencia al objeto que estoy perfilando entre en alcance, entonces el generador de perfiles no solo está perfilando el constructor, sino que está sincronizando todo lo demás.

Del mismo modo, hay un nivel de anidamiento, si anido los usos correctamente, entonces el código no se puede leer.

He echado un vistazo a Profiler.Inline, pero eso no sirve para mis propósitos.

Lo que realmente me gustaría hacer es la siguiente:

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

¿Eso tiene sentido? Espero tener algo en Mini Profiler, pero me gustaría recibir cualquier sugerencia.

Me gustaría remodelar un poco el código, pero no hay tiempo para eso y aunque parece extraño, en realidad tenemos una complejidad ciclomática bastante buena.

Respuesta

7

Sí, esto es posible. En lugar de usar el using solo use "MiniProfiler.Current.Step (" blah ")". Esto devolverá un objeto que implementa IDisposeable. Cuando ese objeto realmente se elimina es cuando los tiempos se detendrán. Incluso puede anidar las cosas con las declaraciones using como siempre.

Ejemplo:

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, gracias! –

+0

Tenga en cuenta que si el MiniProfiler no se inicia, ejecutarStep será nulo, por lo que necesitará "if (executingStep! = Null) executingStep.Dispose()" para este caso. – eddiegroves

Cuestiones relacionadas