- بواسطة x32x01 ||
🎯 الفرق بين Singleton و Scoped و Transient في الـ Dependency Injection
الـ Dependency Injection (DI) من أهم المفاهيم في .NET Core، وطبّعًا قبل ما تبدأ تشتغل عليه بجد، لازم تكون فاهم كويس الفرق بين Service Lifetimes:
Singleton، Scoped، وTransient.
الاختيار بينهم غلط ممكن يعملك مشاكل في الـ Performance أو الـ Data Integrity بدون ما تحس.
وبعد كده، طول عمر التطبيق، أي طلب يجي لل-Service دي بياخد نفس الـ Instance.
يعني ممكن تلاقي Data بتتلخبط بين الـ Users… وده كارثي 😅
لو محتاج تخليها Singleton، اتأكد إنها Thread-Safe ويفضل تكون Stateless.
كل Request بيدخل للتطبيق → بيتعمله Scope خاص بيه.
وأي Service متسجلة كـ Scoped، هيتعمل لها Instance واحدة جوه الـ Request ده فقط.
كل Request لازم يتعامل ب Database Context مستقل عشان:
يعني لو Injected 3 مرات → هتاخد 3 Instances منفصلين.
الـ Dependency Injection (DI) من أهم المفاهيم في .NET Core، وطبّعًا قبل ما تبدأ تشتغل عليه بجد، لازم تكون فاهم كويس الفرق بين Service Lifetimes:
Singleton، Scoped، وTransient.
الاختيار بينهم غلط ممكن يعملك مشاكل في الـ Performance أو الـ Data Integrity بدون ما تحس.
Singleton 🟢
لما تسجّل Service كـ Singleton، الـ Runtime بيعمل Instance واحدة بس منها أول مرة تتطلب.وبعد كده، طول عمر التطبيق، أي طلب يجي لل-Service دي بياخد نفس الـ Instance.
أمتى نستخدم Singleton؟
- لما تبقى محتاج Data مشتركة بين كل أجزاء التطبيق.
- أو لما تكون الـ Service نفسها State ثابت ومش بيتغير.
- مناسب جدًا لحاجات زي:
- إعدادات التطبيق (Configuration)
- Memory Cache
- Logging Services
⚠️ احترس
لو الـ Singleton فيها State بيتغير، ممكن يحصل مشاكل بسبب:- تعدد الـ Threads
- Requests مختلفة بتعدل نفس الـ Object
يعني ممكن تلاقي Data بتتلخبط بين الـ Users… وده كارثي 😅
لو محتاج تخليها Singleton، اتأكد إنها Thread-Safe ويفضل تكون Stateless.
Scoped 🟡
الـ Scoped هو حل وسط ما بين Singleton و Transient.كل Request بيدخل للتطبيق → بيتعمله Scope خاص بيه.
وأي Service متسجلة كـ Scoped، هيتعمل لها Instance واحدة جوه الـ Request ده فقط.
مثال واضح:
DbContext في Entity Framework Coreكل Request لازم يتعامل ب Database Context مستقل عشان:
- يمنع تعارض البيانات بين المستخدمين
- يتأكد إن الـ Transactions سليمة
- يضمن إن الـ Resources بتت Dispose بشكل صحيح
إمتى استخدم Scoped؟
- لما تكون الـ Service بتتعامل مع Data مرتبطة بالـ Request نفسه.
Transient 🔵
الـ Transient Services بيتعملها Instance جديدة كل مرة يتم طلبها.يعني لو Injected 3 مرات → هتاخد 3 Instances منفصلين.
مناسب لـ:
- Operations قصيرة ومبتخزنش Data
- Utility Functions
- Services خفيفة مفيهاش State
مميزاته:
- Zero Shared State = مفيش تداخل في البيانات.
عيبه:
- لو بتتطلب كتير جدًا → ممكن تعمل Overhead بسيط في إنشاء الـ Objects
بس غالبًا بيكون غير ملحوظ.
مقارنة سريعة ⚡
| النوع | عدد الـ Instances | الأفضل في | مثال نموذجي |
|---|---|---|---|
| Singleton | واحدة لكل التطبيق | Caching / Config / Logging | MemoryCache, AppSettings |
| Scoped | واحدة لكل Request | Database operations | DbContext |
| Transient | جديدة كل مرة | Utilities / Stateless operations | ValidationService |
الخلاصة 🧠✨
- لو عندك State مشترك وثابت → استخدم Singleton
- لو الـ Data مرتبطة بالـ Request → استخدم Scoped
- لو الخدمة Stateless خفيفة → استخدم Transient