משך: 2 שעות אקדמיות (90 דקות).

מטרת השיעור: הסטודנטים יבינו ש-DI הוא DIP במימוש מעשי, וישתמשו ב-Constructor Injection בביטחון.

בסוף השיעור הסטודנטים צריכים: לרשום שירות ב-DI Container, להזריק אותו ל-Controller דרך הקונסטרוקטור, ולהסביר את ההבדל בין Scoped ל-Singleton.

דגש קריטי: פתחו בחזרה מפורשת על דוגמת ה-CheckoutService/IPaymentGateway מיחידת ה-SOLID — זה בדיוק אותו רעיון, לא נושא חדש.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותחזרה על DIP — CheckoutService שמקבל IPaymentGateway
שלב 1: הבעיה — new מקושח10 דקותnew EmailNotifier() בתוך ה-Controller — מה קורה כשמחליפים ל-SMS?
שלב 2: Constructor Injection ידני15 דקותController מקבל תלות — אבל מי יוצר אותו?
שלב 3: רישום ב-Program.cs20 דקותAddScoped — DI Container נכנס לתמונה
שלב 4: רואים את זה עובד + מחליפים מימוש15 דקותהדגמה חיה — שורה אחת, כל ה-Controllers מקבלים את השינוי
Service Lifetime20 דקותScoped/Singleton/Transient עם דוגמאות
תרגול מודרך5 דקותתרגיל 1

דגשים להעברת השיעור

  • זהו אחד השיעורים החשובים ביותר לחיבור בין תיאוריה (SOLID) למעשה (Framework אמיתי) — הקדישו זמן לחזרה על DIP לפני שמציגים את ה-DI Container, לא רק אזכור חטוף.
  • Service Lifetime הוא נקודת בלבול נפוצה — טבלת השוואה ברורה (Scoped=לכל בקשה, Singleton=לכל התוכנית, Transient=לכל בקשה-לתלות) שווה זמן.
  • ההדגמה של “החלפת מימוש בשורה אחת” (מ-EmailNotifier ל-SmsNotifier) היא הרגע ה"וואו" של השיעור — תנו לה משקל.

מושגים

DI Container — מנגנון שמנהל אילו מימושים תואמים לאילו Interfaces. Constructor Injection — קבלת תלות כפרמטר קונסטרוקטור. Service Lifetime — Scoped/Singleton/Transient — כמה זמן חי כל מופע.


תרגיל חשיבה

שאלת פתיחה: “אם תרשמו שירות שמחזיק חיבור למסד נתונים כ-Singleton (אחד לכל התוכנית) במקום Scoped (לכל בקשה) — מה עלול להשתבש כשהרבה משתמשים ניגשים לאתר בו-זמנית?”

מהלך: הובילו לתובנה: Singleton משותף בין כל הבקשות במקביל — אם שני משתמשים שונים משתמשים באותו חיבור/מצב בו-זמנית, עלול להיווצר “ערבוב” נתונים בין בקשות שונות. Scoped מבטיח שלכל בקשה יש מופע נפרד משלה, בלי הפרעה הדדית.

מה המרצה מראה בסוף: אם אפשר, הריצו שתי בקשות “בו-זמנית” (או ברצף מהיר) מול שירות רשום כ-Scoped לעומת Singleton שמחזיק מונה פנימי — הראו שב-Scoped כל בקשה מתחילה “טרייה”, וב-Singleton המונה ממשיך להצטבר בין בקשות שונות. ההבדל הזה הוא בדיוק למה בחירת Lifetime נכונה חשובה.