
HttpRuntime.Cache.OnActionExecuting ובודק אם המפתח menu קיים בקאש. אם לא, הוא טוען את פריטי התפריט מהדאטאבייס ומכניס אותם לקאש.CacheItemRemovedReason: DependencyChanged, Expired, Removed או Underused. בשלוש הראשונות טוענים את הפריט מחדש.Remove על המפתח מוציאה את הפריט, והגלישה הבאה תטען אותו מחדש.הטקסט המלא של הדקות הראשונות בהרצאה «שימוש ב-Cache - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הנושא הבא שלנו נקרא קאש. מה זה קאש? קאש זה אזור זיכרון שבו אנחנו שומרים מידע שנדרש בתדירות גבוהה. יש כל מיני אזורי זיכרון שונים בתוכנית, ולכל מיני רכיבים או מערכות יש אזורי זיכרון, ואם יש איזושהי מערכת ששומרת מידע בזיכרון בתדירות גבוהה, האזור הזה נקרא קאש.
לדוגמה, לדפדפן, יש קאש שבו הוא שומר תמונות שהוא הוריד, לינקים, בכדי שהוא לא יצטרך להוריד אותם עוד פעם. גם ב-MVC יש אזור זיכרון שנקרא Cache, שבו אנחנו יכולים לשמור מידע שאנחנו צריכים אותו שוב ושוב.
עכשיו, למה חשוב לנו לדעת את זה? מפני שאם בוא נניח יש לנו רשימה שאנחנו רוצים אותה בכל מיני אקשנים, לדוגמה רשימת ערים. רשימת ערים זה לא משהו שמשתנה כל יום או כל יומיים.
ולכן אם אנחנו ניקח את רשימת הערים ונשמור אותה ב-Database, שזה בלי קשר מה שאנחנו צריכים לעשות, אז כל פעם שאנחנו נרצה לגשת ולהציג את רשימת הערים, נצטרך לגשת לדאטאבייס ולשלוף אותה ולהציג אותה.
מה הבעיה עם זה? גישה לדאטאבייס זה כבר הלוקבוק של המערכת. זה משהו שלוקח הרבה זמן. עכשיו, אם זאת אותה רשימה עבור כל הלקוחות ועבור כל האקשנים שאנחנו צריכים את הרשימה הזאת, עדיף לשמור אותה בזיכרון של השרת של MVC ולא במסד נתונים.
ואז הפנייה לאזור זיכרון הר"מ על ידי איזשהו אובייקט היא הרבה הרבה יותר מהירה מאשר לפנות אז זה שימוש אחד שאנחנו יכולים לעשות בקאש. שימוש נוסף שניתן לבצע בקאש זה לשמור ממש דפים שלמים או views שלמים בקאש שאם בן אדם ירצה לגלוש ל-view הוא יקבל אותו המערכת תיצר אותו אבל אם בן אדם אחר או אותו בן אדם ירצה את אותו ה-view בדיוק אנחנו יכולים לשמור
אותו למספר מסוים של שניות באזור זיכרון קאש בכדי שהוא לא ייווצר מחדש אלא מיד יחזור ה-view שכבר נוצר. ואנחנו הולכים לראות את שתי השיטות האלה. נתחיל עם השיטה הראשונה שבה אנחנו שומרים מידע משלנו שהוא לוביו בתוך אובייקט מיוחד שנקרא קאש.
לצורך הדוגמה בואו נחשוב מה אנחנו רוצים לשמור. נניח שיש לנו תפריט מסוים שאנחנו רוצים להציג באתר ואנחנו רוצים לשלוט על התפריט כך שמנהל האתר יוכל לשנות אותו בצורה דינמית, יוכל להוסיף לו דפים נוספים לתפריט ואנחנו רוצים שהמידע הזה יישמר בדאטאבייס.
כך שאם לקוח גולש ורוצה לראות את התפריט, אז קודם כל המערכת טוענת את התפריט הקיים מהדאטאבייס ומציגה לו מה שכרגע קיים בתפריט. בהמשך אפשר, האדמיניסטרטור יכול להוסיף למסד הנתונים עוד כניסות לתפריט, ואז זה אוטומטית יוצג למשתמשים.
אז אם התפריט הזה הוא זהה לכולם, אנחנו לא רוצים בכל גלישה לשרת לגשת לדאטאבייס ולהוציא את המידע של התפריט בשביל להציג. אנחנו רוצים פעם אחת להוציא אותו ולשמור אותו בקאש למשך זמן מסוים ואז אנחנו נוכל פשוט לקחת אותו מהקאש ולהציג אותו במקום כל פעם לגשת לדאטאביס.
לצורך כך בואו נבנה קודם כל בייס קונטרולר בכדי לבצע את הטעינה של התפריט בכל האקשנים. אז ניצור בייס קונטרולר, נמחק את כל מה שיש בו ונדרוס את הפונקציה on action executing.
כלומר ברגע שהאקשן מסוימת מתבצעת אנחנו רוצים לגשת לדאטאבייס ולטעון את המידע של התפריט. כאן ניקח view-bag, נפתח משתנה שנקרא מניו ונקרא לפונקציה שנקראת get-menu שאותה אנחנו צריכים לבנות.
בואו נבנה אותה. הפונקציה הזאת כל מה שהיא רוצה לעשות זה לבדוק האם המידע כבר קיים בקאש. אם הוא קיים בקאש אנחנו פשוט ניקח אותו מהקאש, אם לא אנחנו רוצים לגשת לדאטאבייס ולהביא אותו.
אז קודם כל מה שנעשה נפתח פה ליסט של סטרינג נקרא לה מניו וניגש ל-http-runtime.cash זה האובייקט שמאפשר לנו להכניס דברים לתוך ה-cash.
כאן אנחנו ניגש לכניסה שנקראת מניו, מפתח שנקרא מניו, נמיר אותו ל-list של סטרינג ונבדוק האם המניו הזה הונל.
אם המניו הונל, אנחנו רוצים לגשת לדאטאבייס. בואו ניגש לדאטאבייס ונביא list של סטרינג עם הערכים הנוכחיים של התפריט. שזה home, products, orders, suppliers ו-contact.
זאת אומרת שפה יש לנו את הגישה לדאטאבייס. אחרי שהבאנו את המידע מהדאטאבייס, ניגש לאובייקט ה-cash, במיקום menu, ונחניף לשם את האובייקט.
לבסוף, נחזיר את האובייקט, בין אם הוא היה ב-cash ובין אם לא, הכנסנו אותו ל-cash, וכך המידע של התפריט כל הזמן נמצא ב-cash ואנחנו לא צריכים לגשת לדאטאבייס.
הפקודה שלוקחת פה הכי הרבה זמן זאת הגישה לדאטאבייס, זאת הפקודה הזאת. אבל פעם אחת אנחנו עושים את זה, מכניסים את זה ל-cash, פעם הבאה שמישהו ירצה את התפריט, הערך ב-cash כבר שונה מנ"ל ולכן אנחנו לא ניגש עוד פעם לדאטאבייס אלא נחזיר ישירות את מה שכבר קיים בתוך ה-cash, שזה התפריט
הסטנדרטי שכבר קיים לנו. אז קודם כל נשאר לנו רק להשתמש בפונקציה הזאת, נוסיף איזשהו קונטרולר, נקרא לו products עבור מוצרים, יש לנו פה את פונקציית אינדקס, מייצר עבור ה-view, יש לנו פה view,