- بواسطة x32x01 ||
الـ 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