# מערך שיעור: 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 נכונה חשובה.
