اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
اگر مطلب "ذخیره سازی SQL تولیدی در NH3" را دنبال کرده باشید که یک مثال عملی از "NHibernate 3.0 و عدم وابستگی مستقیم به Log4Net" بود، خروجی حاصل از آن به صورت زیر است:
---+ 12/29/2010 05:35:59.75 +---
SQL ...
---+ 12/29/2010 05:35:59.75 +---
SQL ...
خوشبختانه در دات نت فریم ورک میتوان با بررسی Stack trace ، رد کاملی را از فراخوانهای متدها یافت:
StackTrace stackTrace = new StackTrace();
StackFrame stackFrame = stackTrace.GetFrame(1);
MethodBase methodBase = stackFrame.GetMethod();
Type callingType=methodBase.DeclaringType;
بر این اساس سورس مثال قبل را جهت درج اطلاعات فراخوانهای متدها تکمیل کردهام، که از این آدرس قابل دریافت است.
اکنون اگر از این ماژول جدید استفاده کنیم، خروجی نمونهی آن به صورت زیر خواهد بود:
---+ 01/02/2011 02:19:24.98 +---
-- Void ASP.feedback_aspx.ProcessRequest(System.Web.HttpContext) [File=App_Web_4nvdip40.5.cs, Line=0]
--- Void Prog.Web.UserCtrls.FeedbacksList.Page_Load(System.Object, System.EventArgs) [File=FeedbacksList.ascx.cs, Line=23]
---- Void Prog.Web.UserCtrls.FeedbacksList.BindTo() [File=FeedbacksList.ascx.cs, Line=43]
----- System.Collections.Generic.IList`1[Feedback] Prog.GetAllUserFeedbacks(Int32) [File=FeedbackWebRepository.cs, Line=66]
SELECT ...
@p0 = 3 [Type: Int32 (0)]
اینطوری حداقل میتوان دریافت که SQL تولیدی دقیقا به کجا بر میگردد و چه متدی سبب صدور آن شده است.
ملاحظات:
این ماژول تنها در صورت وجود فایل pdb معتبر کنار اسمبلیهای شما این خروجی مفصل را تولید خواهد کرد. در غیر اینصورت از آن صرفنظر میکند. (برای مثال نام فایل سورس فراخوان، شمارهی سطر فراخوان، حتی محل قرارگیری آن فایل بر روی کامپیوتر شما در فایلهای pdb ثبت میگردند؛ به همین جهت توصیه اکید حین ارائهی نهایی برنامه، حذف این نوع فایلها است)