Autofac: مرجع من نوع واحد إلى httprequestscoped
سؤال
لديّ تطبيق حيث يحتاج كائن مشترك إلى إشارة إلى كائن لكل طلب.
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>());
لا تنتمي إلى StackOverflow