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

x32x01
  • بواسطة x32x01 ||
🎯 الفرق بين 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
المشاهدات
1K
x32x01
x32x01
x32x01
الردود
0
المشاهدات
4
x32x01
x32x01
x32x01
الردود
0
المشاهدات
45
x32x01
x32x01
x32x01
الردود
0
المشاهدات
906
x32x01
x32x01
x32x01
الردود
0
المشاهدات
6
x32x01
x32x01
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟
إحصائيات المنتدى
المواضيع
1,983
المشاركات
2,183
أعضاء أكتب كود
479
أخر عضو
as6318380@gmail
عودة
أعلى