2012-12-17 21 views
12

मैं नेट एमवीसी 3 के साथ ऑटोफैक का उपयोग कर रहा हूं। ऐसा लगता है कि ऑटोफैक एप्लिकेशन_इंडरक्वैस्ट में जीवनकाल के दायरे का निपटान करता है, जो समझ में आता है। लेकिन उस जिसके कारण त्रुटि जब मैं अपने खुद के कोड में एक सेवा है जो EndRequest दौरान कार्यान्वित खोजने की कोशिश:मैं EndRequest में ऑटोफैक का उपयोग कैसे कर सकता हूं?

public T GetInstance<T>() 
    { 
     return DependencyResolver.Current.GetService<T>(); 
    } 
:

MESSAGE: Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed. 
STACKTRACE: System.ObjectDisposedException 
    at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) 
    at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters) 
    at System.Web.Mvc.DependencyResolverExtensions.GetService[TService](IDependencyResolver resolver) 

संदर्भ के लिए, कोड मैं सेवाओं हल करने का प्रयास करने के लिए उपयोग कर रहा हूँ है

क्या कोई तरीका है कि मेरे पास एंड्रॉक्वेस्ट से निष्पादित कोड हो सकता है, सेवा समाधान के लिए ऑटोफैक का लाभ उठाएं?

संपादित करें: मैंने एंड्रॉवेस्ट के दौरान बस एक अलग दायरे के साथ ऐसा करने का विचार किया, जैसा कि जिम नीचे सुझाता है। हालांकि, इसका मतलब है कि InstancePerHttpRequest के रूप में पंजीकृत कोई भी सेवा EndRequest के दौरान एक नया उदाहरण प्राप्त करेगी, जो गैर-आदर्श लगता है।

उत्तर

0

आपको शायद अपना जीवनकाल का दायरा बनाना होगा। मान लिया जाये कि आप अपने global.asax.cs में कुछ इस है: अपने EndRequest में

public class MvcApplication : HttpApplication 
{ 
    internal static readonly IContainer ApplicationContainer = InitAutofac(); 
} 

तो फिर तुम कुछ इस तरह कर सकता है:

using (var scope = MvcApplication.ApplicationContainer.BeginLifetimeScope()) 
{ 
    var service = scope.Resolve<Stuff>(); 
    service.DoStuff(); 
} 
+0

ऊपर मेरे संपादन देखें। यह काम करता है, लेकिन आदर्श रूप से मैं अपने कोड को एंड्रॉवेस्ट में अपने अन्य कोड के समान जीवनकाल के दायरे में रखना चाहता हूं, ताकि 'InstancePerHttpRequest' अपेक्षा के अनुसार काम करे। – eliah

+0

फिर आपको एंड्रॉक्वेट से पहले अपना कोड चलाने के लिए या किसी भी तरह ऑटोफैक में सीधे हुक करना होगा ताकि आप ऑटोफैक लपेटने से पहले अपने कोड को फायर कर सकें। –