سؤال

لديّ تطبيق حيث يحتاج كائن مشترك إلى إشارة إلى كائن لكل طلب.

Shared:      Engine
                |
Per Req:  IExtensions()
                |
             Request

إذا حاولت حقن IExtensions مباشرة في مُنشئ Engine, ، حتى Lazy(Of IExtension), ، أحصل على "لا يوجد نطاق مطابقة [طلب] مرئي من النطاق الذي تم فيه طلب المثيل". استثناء عندما يحاول إنشاء كل IExtension.

كيف يمكنني إنشاء مثيل httprequestscoped ثم حقنه في مثيل مشترك؟

هل يعتبر ممارسة جيدة وضعها في Requestمصنع (وبالتالي الحقن Engine داخل RequestFactory)?

هل كانت مفيدة؟

المحلول

بسبب متطلبات العمر المشتركة لـ Engine لا يمكنك حقن الامتدادات التي يتم سكيرها في الطلب. ما يمكن أن يكون لديك طريقة أو خاصية على المحرك ستحل بنشاط مجموعة من الامتدادات من نطاق الطلب الحالي.

لذلك أولاً ، دع Engine خذ تبعية مُنشئ:

public class Engine
{
    public Engine(..., Func<IExtensions> extensionsPerRequest) 
    {
        _extensionsPerRequest = extensionsPerRequest;
    }


    public IExtensions Extensions
    {
       get { return _extensionsPerRequest(); }
    }
 }

وبعد ذلك ، في تسجيل Autofac:

builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top