2012-02-29 34 views
6

Jesteśmy modelowania skomplikowany system opiera się na skomplikowanej relacji podmiotu w Dynamics CRM 4.0Stepping MVC Mini Profiler bez zagnieżdżonych usings

Ze względu na charakter rozwoju musieliśmy wdrożyć repozytorium wzór stylu i mają wiele różnych dostawców, którzy odnoszą się do siebie nawzajem.

Co naprawdę chcę zrobić, to profilować swoje konstruktory i różne leniwy pobierające, ale chcę modelować to na najwyższym poziomie możliwym.

Problem leży oczywiście w zakresie - jeśli zawinę konstruktora w bloku przy użyciu, nie będzie on dostępny dla niczego innego. Jeśli rozszerzam blok przy użyciu tak, aby wszystko, co odwołuje się do obiektu, który profiluję, wchodzi w zakres, to profiler nie jest tylko profilowaniem konstruktora - jest to synchronizowanie wszystkiego.

Podobnie, istnieje poziom zagnieżdżenia, jeśli poprawnie zagnieżdżę użytki, kod stanie się nieczytelny.

Spojrzałem na Profiler.Inline, ale to nie służy moim celom.

Co Naprawdę chciałbym zrobić to w ten sposób:

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

Czy to ma sens? Mam nadzieję, że przegapię coś w Mini Profiler, ale z przyjemnością przyjmuję wszelkie sugestie!

Chciałbym przebudować kod nieco, ale nie ma na to czasu i chociaż wygląda na dziwne, mamy całkiem niezłą złożoność cykliczną.

Odpowiedz

7

Tak, jest to możliwe. Zamiast korzystać z using wystarczy użyć "MiniProfiler.Current.Step (" bla ")". Spowoduje to zwrócenie obiektu implementującego IDisposeable. Kiedy ten przedmiot jest rzeczywiście usuwany, to jest, gdy czasy się zatrzymają. Możesz nawet zagnieżdżać rzeczy z instrukcjami using, tak jak zwykle.

Przykład:

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

Brilliant, dziękuję! –

+0

Należy zauważyć, że jeśli MiniProfiler nie zostanie uruchomiony, wówczas wykonanie kroku będzie zerowe, więc będziesz potrzebował "if (executingStep! = Null) wykonującyStep.Dispose()" dla tego przypadku. – eddiegroves