الفرق بين Singleton و Scoped و Transient في DI

x32x01
  • بواسطة x32x01 ||
  • #1
🎯 الفرق بين Singleton و Scoped و Transient في الـ Dependency Injection
الـ 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 / LoggingMemoryCache, AppSettings
Scopedواحدة لكل RequestDatabase operationsDbContext
Transientجديدة كل مرةUtilities / Stateless operationsValidationService

الخلاصة 🧠✨​

  • لو عندك State مشترك وثابت → استخدم Singleton
  • لو الـ Data مرتبطة بالـ Request → استخدم Scoped
  • لو الخدمة Stateless خفيفة → استخدم Transient
الفكرة مش مين أفضل… الفكرة مين الأنسب لموقفك.
 

المواضيع ذات الصلة

x32x01
الردود
0
المشاهدات
2K
x32x01
x32x01
x32x01
الردود
0
المشاهدات
304
x32x01
x32x01
x32x01
الردود
0
المشاهدات
261
x32x01
x32x01
x32x01
الردود
0
المشاهدات
411
x32x01
x32x01
x32x01
الردود
0
المشاهدات
184
x32x01
x32x01
الوسوم : الوسوم
.net core dbcontext dependency injection memorycache scoped service lifetimes singleton thread-safe transient
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟

آخر المشاركات

إحصائيات المنتدى
المواضيع
2,388
المشاركات
2,601
أعضاء أكتب كود
574
أخر عضو
الياس
عودة
أعلى