2012-02-29 25 views
6

Chúng tôi đang mô hình hóa một hệ thống phức tạp dựa trên một mối quan hệ thực thể phức tạp trong Dynamics CRM 4.0Bước MVC Mini Profiler mà không usings lồng

Do tính chất của sự phát triển chúng tôi đã phải thực hiện một mẫu phong cách kho và có rất nhiều của các nhà cung cấp khác nhau có liên quan đến nhau.

Điều tôi thực sự muốn làm là lập hồ sơ cho các nhà thầu của họ và các getters lười biếng khác nhau, nhưng tôi muốn mô hình hóa điều này ở cấp cao nhất có thể.

Vấn đề là, tất nhiên, Phạm vi - Nếu tôi bọc hàm tạo trong một khối sử dụng, nó không có sẵn cho bất kỳ thứ gì khác. Nếu tôi mở rộng khối sử dụng để mọi thứ tham chiếu đến đối tượng mà tôi lược tả đi vào phạm vi, thì trình lược tả không chỉ là lược tả hàm tạo - nó định thời gian mọi thứ khác.

Tương tự, có một mức làm tổ, Nếu tôi lồng đúng cách sử dụng, thì mã sẽ không thể đọc được.

Tôi đã xem Profiler.Inline nhưng điều đó không phục vụ mục đích của tôi.

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

Việc đó có ý nghĩa:

Những gì tôi thực sự muốn làm điều này là gì? Hy vọng rằng tôi đang xem một cái gì đó trong Mini Profiler, nhưng tôi muốn chào đón bất kỳ đề xuất!

Tôi muốn sửa đổi mã một chút, nhưng không có thời gian cho điều đó và trong khi có vẻ kỳ lạ, chúng tôi thực sự có độ phức tạp chu kỳ khá tốt.

Trả lời

7

Có điều này là có thể. Thay vì sử dụng using chỉ cần sử dụng "MiniProfiler.Current.Step (" blah ")". Điều này sẽ trả về một đối tượng thực hiện IDisposeable. Khi đối tượng đó thực sự được xử lý là khi thời gian dừng lại. Thậm chí bạn có thể lồng ghép mọi thứ với các câu lệnh using giống như bình thường.

Ví dụ:

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, cảm ơn bạn! –

+0

Lưu ý rằng nếu MiniProfiler không được khởi động thì thực thiStep sẽ là null, vì vậy bạn sẽ cần "if (executeingStep! = Null) executeingStep.Dispose()" cho trường hợp này. – eddiegroves