تكرار السؤال: …
الإجابة المختصرة
تسمح بتسجيل عدة تطبيقات لنفس الواجهة بمفاتيح تمييز صريحة واستدعائها بدقة عبر سمة [FromKeyedServices("key")] دون الحاجة لمصانع مخصصة.
الشرح
قديماً، إذا كان لديك تطبيقان لواجهة IPaymentService (أحدهما لـ Stripe والآخر لـ PayPal)، كان المطور يضطر لبناء Factory Pattern معقد أو استخدام حاويات خارجية مثل Autofac. في .NET 8، أضيف دعم أصيل: builder.Services.AddKeyedScoped<IPaymentService, StripePayment>('stripe')، ويتم حقن النسخة المطلوبة مباشرة في المتحكم بوضع السمة [FromKeyedServices('stripe')].
مثال بالكود
builder.Services.AddKeyedSingleton<INotificationSender, EmailSender>("email");
builder.Services.AddKeyedSingleton<INotificationSender, SmsSender>("sms");
// الاستخدام في المتحكم
public class AlertController([FromKeyedServices("sms")] INotificationSender sender) { ... }أخطاء شائعة
- محاولة حقن خدمة بـ [FromKeyedServices] دون تسجيل المفتاح في الـ Container مما يرمي InvalidOperationException.