
DurationInterceptor יורשת מ-DbCommandInterceptor מ-Microsoft.EntityFrameworkCore.Diagnostics, וצריך גם using System.Data.Common.ReaderExecuting נקראת לפני הביצוע בדאטאבייס, ו-ReaderExecuted אחריו.start ו-end מכניסים DateTime.Now לפני ואחרי. אחרי הביצוע מחשבים duration מסוג TimeSpan מהפרש הזמנים ומדפיסים TotalMilliseconds בצבע צהוב, ואז Console.ResetColor.UseSqlServer, דרך AddInterceptors. אפשר להעביר כמה מיירטים. בהרצה: כ-21 עד 22 אלפיות שנייה לשאילתה, ובהרצות נוספות 19 עד 20.LogQueryInterceptor נשאר עם ReaderExecuting בלבד, ומדפיס בירוק את Command.CommandText ואחריו קו הפרדה.display all gifts מודפסת שאילתת select על הטבלה.display one gift יש שאילתה עם where. מודפסים רק הפרמטרים שמחוברים לשאילתה, ולא הערך הסופי.add gift מודפסת שאילתת insert into gifts שלקחה 31 אלפיות שנייה. לפניה Entity Framework מגדירה הגדרות גלובליות.CommandText אפשר גם לשנות שאילתה או לבטל אותה, אבל בדרך כלל משתמשים במיירטים לאבחון, בדיקות ותזמונים.הטקסט המלא של הדקות הראשונות בהרצאה «יירוט שאילתות Intercepting Queries» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
ישנו דבר מעניין נוסף ש-Entity Framework Core מאפשרת לנו לבצע, וזה בנייה של משהו שנקרא Interceptor. Interceptor בעברית זה מיירט. To intercept something זה ליירט משהו.
כאילו, לתפוס אותו באמצע, לבדוק מה קורה כשהוא מתבצע, דברים כאלה. המטרה בעצם זה לאפשר לכתוב קטע קוד שיתבצע אוטומטית שאנטיטי פריימורק תבצע איזושהי שאילתא בדאטאבייס.
אנחנו יכולים להשתמש בקונספט הזה של אינטרספטורס בשביל מספר דברים. אנחנו יכולים לדוגמה להתבונן במה בעצם אנטיטי פריימורק מנסה לעשות בדאטאבייס.
מהי השאילתא? אנחנו יכולים למדוד זמנים, כמה זמן לוקח לאנטיטי פריימורק לבצע את הפעולות האלה. בואו נראה איך אפשר לבנות אינטרספטור. אני אעשה את זה ב-Utilities, אפשר לעשות את זה גם במודלס.
אני אצרף איזשהו קובץ קלאס אני אקרא לו interceptors ברבים כי יכול להיות לי אחד או יותר בואו נצרף אותו נטפל רגע במרחב השמות ומה שאנחנו רוצים לעשות זה לבנות בוא נניח אני אבנה קודם כל interceptor שפשוט מודד לי זמנים כמה זמן לוקח ל-ndt framework לבצע פעולה כזו או אחרת בואו נקרא ל-interceptor הזה רק לא interceptors ברבים אלא נקרא לו Duration Interceptor.
אנחנו רוצים לרשת ממחלקה שנקראת db-command Interceptor. הנה היא כאן, אנחנו רואים שהיא מגיעה מ-entity framework core נקודת Diagnostics.
Diagnostics זה כל מה שקשור לעולם של הדיאגנוסטיקה, בדיקות, טסטינג, דברים כאלה. בדרך כלל זה לבדוק פרפורמנס, זיכרון, כל מיני ערכים כאלה.
אנחנו צריכים כאן בנוסף, רגע ניפטר מכל אלה, אנחנו צריכים בנוסף using system.data.common זה משהו שאנחנו חייבים לצרף אותו בצורה יזומה אחרת visual studio לא תמצא את מה שאנחנו מחפשים ומה שאנחנו רוצים לעשות זה to override ויש לנו אפשרות To Override שתי פונקציות, אחת זה Reader Executing והשנייה Override
Reader Executed. Executing זה אומר אנטיטי פריימרוק עדיין לא ביצעה את הפעולה בדאטאבייס, היא הולכת לעשות. Executed היא כבר ביצעה, זה בעבר.
לכן אנחנו יכולים לפתוח כאן פריווט, משתנה פרטי מסוג Daytime ונקרא לו סטארט. נבצע עוד אחד ונקרא לו end ובעצם הם מודדים לנו את הזמנים. לפני שאנטיטי פריימורק עושה את הפעולה ניגש לסטארט ונכניס לתוכו day time now כמה הזמן ההתחלתי.
אחרי שאנטיטי פריימורק סיימה לבצע את הפעולה בדאטאבייס נבצע את אותו הדבר על end day time.now כעת אנחנו יכולים באקסקיוטד אחרי שסיימנו למדוד כמה זמן לבנות משתנה אפשר אפילו שהוא יהיה לוקאלי מסוג time span נרווח זמן.
בואו נקרא לו duration ונכניס לתוכו את ה-end פחות הסטארט. האופרטור המינוס בעצם נותן לנו time span, כמה זמן חלף.
בואו נציג כמה זמן חלף. כמובן אנחנו יכולים להציג את זה בדקות, שעות, שניות, אבל בגלל שזה כל כך מעט זמן זה בעצם נמדד פחות או יותר במילי סקנדס, אז נציג total מילי סקנדס ונשרשר duration נקודה total מילי.
והנה יש לנו כאן את ההדפסה הזאת. בואו רק אולי נצבע אותה באיזשהו צבע אחר. נגדיר כאן console. foreground נגיד yellow ו-console.resetColor שיחזיר לנו את הצבע. ואז אנחנו נראה את זה קצת יותר בוהק על המסך.
בואו ניגש למחלקת הפרוגרם שלנו יש לנו פה את display all gifts יש לנו פה הצגה של display all gifts אבל אם אנחנו נריץ את הפרויקט אנחנו לא באמת נראה את ההדפסה הזאת אין לנו פה את התצוגה למה אין לנו את התצוגה כי אנחנו צריכים לרשום את האינטרספטור שבנינו אנחנו רושמים את האינטרספטור ברמת הקונטקסט.
ויש לנו כאן את זה use sql server פה אנחנו אומרים לו תשתמש במסד הנתונים sql server אבל הפונקציה הזאת מאפשרת לנו to add interceptors כאן אנחנו יכולים פשוט לתת לו אובייקט מהduration interceptors שבנינו בצורה כזאת ועכשיו רשמנו אותו שימו לב שזה יכול לקבל מערך של אינטרספטורים גם בואו נריץ והנה יש לנו פה total מילי סקנדס לקח לו
21, כמעט 22 מילי שניות להריץ את השאילתה עד שהוא קיבל מידע בחזרה. כמובן, אם אנחנו נריץ את זה שוב פעם, אז אנחנו נראה משהו באזור קצת דומה. פה אנחנו רואים 20 מילי, נריץ שוב, 19 מילי, באזור הזה. בואו נוסיף עוד אינטרספטור מעניין. אנחנו כמובן יכולים לעשות את זה באותו אינטרספטור, אבל רק לצורך הדוגמה, נבנה שני אינטרספטורס.
אני אעתיק את האינטרספטור הזה, אני אדביק אותו פה ונגדיר אותו כ-query או log query interceptor, נוריד את כל הזמנים האלה, אין לנו צורך בשתי הפונקציות אז ניפטר רגע מהפונקציה השנייה, נשאיר רק את executing וכל מה שאנחנו רוצים לבצע זה להדפיס כאן את השאילתה שהולכת להיכתב על המסך.
אני אקח רק את הקוד של הצבעים, אני צובע אותה בגרין ירוק ופשוט אני אדפיס כאן את ה-Command, זאת הפקודה שהולכת לבצע את הפעולה על הדאטאבייס,