On this page
מערך שיעור: Dependency Injection
משך: 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.cs | 20 דקות | AddScoped — DI Container נכנס לתמונה |
| שלב 4: רואים את זה עובד + מחליפים מימוש | 15 דקות | הדגמה חיה — שורה אחת, כל ה-Controllers מקבלים את השינוי |
| Service Lifetime | 20 דקות | 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 נכונה חשובה.