2011-04-01 10 views
8

नोट: यहां 3 प्रश्न हैं और मैंने अलग-अलग प्रश्न नहीं किए हैं क्योंकि वे सभी एक ही कोड से संबंधित हैं।एएसपी.नेट एमवीसी 3, रावेनडीबी, और ऑटोफैक इश्यु प्लस 2 अन्य ऑटोफैक प्रश्न

मैं निम्नलिखित कोड है कि आवेदन के जीवन चक्र के अनुसार एक बार Application_Start में मेरी RavenDB के लिए कनेक्शन पंजीकृत करता है:

var store = new DocumentStore { Url = "http://localhost:8080" }; 
store.Initialize(); 

builder.RegisterInstance(store).SingleInstance(); 

अब इस ठीक काम करता है और यह कुछ ऐसा है प्रति केवल एक बार बनाया जाना चाहिए है आवेदन का जीवन चक्र। अब मैं Autofac को DocumentSession में जोड़ना चाहते थे तो मैं Application_Start में इस में जोड़ने की कोशिश की:

var session = store.OpenSession(); 
builder.RegisterInstance(session).SingleInstance(); 

मेरी UserRepository में मैं निम्नलिखित निर्माता है:

public UserRepository(DocumentStore store, DocumentSession session) 

जब मैं इस चलाने का प्रयास

निर्माता के पैरामीटर 'Raven.Client.Document.DocumentSession सत्र' 'शून्य .ctor (Raven.Client.Document.DocumentStore, Raven.Client.Document.DocumentSession)' को हल नहीं कर सकता:, मैं पालन रनटाइम त्रुटि प्राप्त

मुझे यह त्रुटि लगता है जैसे ऑटोफैक को लगता है कि इसमें एक दस्तावेज़ सत्र नहीं है, हालांकि यह स्टोर है। ओपन सत्र() देता है तो इसे चाहिए। किसी को पता है कि इस त्रुटि का कारण क्या होगा? क्या मैं सत्र चर को सही ढंग से सेट नहीं कर रहा हूं (यह स्टोर वैरिएबल जैसा ही है जो ठीक काम करता है)?

उपरोक्त मुद्दे से संबंधित एक और चीज जो हो सकती है या नहीं हो सकती है, मैं अनुप्रयोग जीवन चक्र के बजाय प्रति अनुरोध ऑटोफैक पर किसी ऑब्जेक्ट का उदाहरण कैसे जोड़ूं? जबकि RavenDB DocumentStore ऑब्जेक्ट केवल जीवन अनुप्रयोग चक्र होने के बाद ही बनाया जाना चाहिए, अनुरोध के बाद दस्तावेज़ सत्र को एक बार बनाया जाना चाहिए (हो सकता है कि प्रति एप्लिकेशन स्तर इसे बनाने से ऊपर की त्रुटि हो रही हो)।

एक आखिरी सवाल मैं ऑटोफैक (उपरोक्त कोड से हल्के से संबंधित) के बारे में वहां फेंक दूंगा, वस्तुओं को छोड़ने के बारे में है। आप इस ट्यूटोरियल पर एक नज़र डालें, तो:

http://codeofrob.com/archive/2010/09/29/ravendb-image-gallery-project-iii-the-application-lifecycle.aspx

कोड के अंतिम टुकड़ा:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 

और इस कोड की बात सत्र लीक को रोकने के लिए है। अब यह कुछ है जिसे मुझे ऑटोफैक के बारे में चिंता करने की भी आवश्यकता है और यदि हां, तो मैं ऑटोफैक में यह कैसे करूं?

उत्तर

11

मैं तुम्हें अनुमान लगा रहा हूँ चाहते हैं कुछ की तरह:

builder.Register(c => c.Resolve<DocumentStore>().OpenSession()).InstancePerLifetimeScope(); 

"डिफ़ॉल्ट ASP.NET और WCF एकीकरण की स्थापना कर रहे हैं ताकि InstancePerLifetimeScope() वर्तमान वेब अनुरोध या सेवा विधि कॉल करने के लिए एक घटक जोड़ देती है । " - Autofac: InstanceScope

मूल रूप से, एक वेब ऐप में, InstancePerLifetimeScope प्रति HTTP संदर्भ पहलू को संभालता है, और IDisposable को लागू करने वाले किसी भी प्रकार का निपटान भी करता है।

+1

@ryanzec: InstancePerLifetimeScope विस्तार से अधिक समझने योग्य है। ऑटोफैक के लेखक के पास एक कंटेनर के पीछे उद्देश्य के बारे में एक उत्कृष्ट लेख है और यह आपके आवेदन में फिट बैठता है: http://blogs.msdn.com/b/nblumhardt/archive/2008/12/27/container-managed- appplication- डिजाइन प्रस्तावना-जहां-करता-कंटेनर-belong.aspx –

1

यह भी मुद्दा था कि OpenSession दस्तावेज़ सत्र के बजाय IDocumentSession देता है।जिम द्वारा सुझाए गए काम करने के साथ-साथ IDocumentSession की तलाश करने के लिए मेरी कक्षा बदलना, धन्यवाद।

संबंधित मुद्दे