2010-05-08 11 views
15

साथ प्रबंध NHibernate ISession किसी के बारे में कैसे Autofac (एक ASP.NET MVC आवेदन के मामले में) NHibernate ISession उदाहरण प्रबंधित कर सकते हैं किसी भी सुझाव या सर्वोत्तम प्रथाओं है?Autofac

उत्तर

18

मैं एनएचबीरनेट सत्रों को संभालने के तरीके से अत्यधिक परिचित नहीं हूं। उस ने कहा, ऑटोफैक में उत्कृष्ट उदाहरण जीवनकाल हैंडलिंग (scoping और deterministic disposal) है। कुछ संबंधित संसाधन this article और this question हैं। चूंकि आप एएसपी.नेट एमवीसी भूमि में हैं, सुनिश्चित करें कि आप the MVC integration stuff पर भी देखें।

public class SomeController 
{ 
    private readonly Func<Owned<ISession>> _sessionFactory; 

    public SomeController(Func<Owned<ISession>> sessionFactory) 
    { 
     _sessionFactory = sessionFactory; 
    } 

    public void DoSomeWork() 
    { 
     using (var session = _sessionFactory()) 
     { 
      var transaction = session.Value.BeginTransaction(); 
      .... 
     } 
    } 
} 

कंटेनर सेटअप पाने के लिए काम करने के लिए यह काफी है:

बिंदु को वर्णन करने के लिए, आप निम्न तरीके से Autofac कारखाने प्रतिनिधियों उपयोग कर सकते हैं पर एक त्वरित नमूना और Owned उदाहरण जीवन पर पूरा नियंत्रण पाने के लिए सामान्य है सरल। सूचना है कि हम Func<> और Owned<> प्रकार प्राप्त करने के लिए कुछ भी करने की जरूरत नहीं है, इन Autofac द्वारा स्वचालित रूप से उपलब्ध कराया जाता है:

builder.Register(c => cfg.BuildSessionFactory()) 
    .As<ISessionFactory>() 
    .SingleInstance(); 
builder.Register(c => c.Resolve<ISessionFactory>().OpenSession()); 

अद्यतन: मेरे तर्क यहाँ है कि, this NHibernate tutorial, के जीवनकाल के अनुसार सत्र उदाहरण "काम की इकाई" का होना चाहिए। इस प्रकार जब सत्र सत्र बनाया जाता है और जब सत्र का निपटारा किया जाता है तो हमें दोनों को नियंत्रित करने की आवश्यकता होती है।

ऑटोफैक के साथ हमें सीधे प्रकार के बजाय Func<> का अनुरोध करके यह नियंत्रण मिलता है। Func<> का उपयोग नहीं करने की आवश्यकता होगी कि नियंत्रक उदाहरण बनने से पहले सत्र उदाहरण पहले बनाया जाए।

अगला, ऑटोफैक में डिफ़ॉल्ट यह है कि उदाहरणों में उनके कंटेनर का जीवनकाल होता है। चूंकि हम जानते हैं कि काम की इकाई पूरी होने के तुरंत बाद हमें इस उदाहरण को निपटाने की शक्ति की आवश्यकता है, हम Owned उदाहरण का अनुरोध करते हैं। स्वामित्व वाले उदाहरण का निपटान इस मामले में तुरंत अंतर्निहित सत्र का निपटान करेगा।

+1

हम्म ... मेरी इच्छा है कि जब लोग डाउनवोट करेंगे तो लोग कुछ रचनात्मक आलोचना देंगे। –

+0

मुझे भी! :) आपके उत्तर के लिए धन्यवाद - मैं आपके सुझावों पर एक नज़र डाल रहा हूं – UpTheCreek

+0

हाय, मैं यहां सबकुछ समझता हूं कि Func <स्वामित्व > से इसका उपयोग क्यों करें - इसका उपयोग क्यों करें? क्यों न केवल मानक आइसियान में इंजेक्ट करें? मुझे यकीन नहीं है कि मैं वास्तव में समझता हूं कि func/स्वामित्व क्या करता है, लेकिन ऑटोफैक दस्तावेज़ के अनुसार, यदि आप इसका उपयोग करते हैं तो आपको ऑब्जेक्ट को मैन्युअल रूप से निपटाना होगा? स्वामित्व वाले के संदर्भ प्राप्त करने वाला एक घटक स्वामित्व पर कॉल करने के लिए ज़िम्मेदार है। उदाहरण के लिए जब आवश्यकता नहीं है। यह स्वामित्व वाले उदाहरणों को साफ करने के लिए एक बग है। http://code.google.com/p/autofac/wiki/NewInV2 – UpTheCreek

0

संपादित करें: ऑटोफैक और शायद अन्य कंटेनर जैसे ध्वनि जीवन भर सही ढंग से गुंजाइश कर सकते हैं। यदि ऐसा है, तो इसके लिए जाओ।

सत्रों का प्रबंधन करने के लिए अपने आईओसी कंटेनर का उपयोग करना अच्छा नहीं है। आपके सत्र का जीवनकाल आपके कार्य की इकाई (लेनदेन सीमा) से मेल खाना चाहिए। किसी वेब एप्लिकेशन के मामले में, यह लगभग निश्चित रूप से वेब अनुरोध का जीवनकाल होना चाहिए।

सबसे आम तरीका इस लक्ष्य को हासिल करने के लिए, एक HttpModule है कि दोनों अपने सत्र बनाता है और जब एक अनुरोध शुरू होता है अपने लेन-देन शुरू होता है के साथ है फिर जब अनुरोध समाप्त हो गया है करता है। मैं HttpModule HttpContext.Items संग्रह में सत्र पंजीकृत करता।

अपने आईओसी कंटेनर में, आप ISessionLocator के खिलाफ HttpContextSessionLocator जैसे कुछ पंजीकृत कर सकते हैं।

मैं उल्लेख करना चाहिए कि अपने सामान्य त्रुटि हैंडलिंग वर्तमान सत्र का पता लगाने और स्वचालित रूप से लेन-देन रोल बैक करना चाहिए, या आप काम का आधा एक इकाई करने से लग सकती है।

+4

* क्यों * यह एक अच्छा विचार नहीं है? –

+1

इस पर जेम्स के साथ सहमत हैं, मैं अपने (एएसपीएनटी एमवीसी) नियंत्रकों में कार्य कारखाने की एक इकाई इंजेक्ट करता हूं और आवश्यकता होने पर नियंत्रक के अंदर से काम की एक इकाई बनाता हूं। कारखाना आईओसी कंटेनर (संरचना मानचित्र) – AwkwardCoder

+0

@AWC के आसपास सिर्फ रैपर वर्ग (सेवा लोकेटर) है: यह वही है जो मैं भी करता हूं।बात यह है कि ऑटोफैक कंटेनर आपको फैक्ट्री सामान ओओटीबी देता है। –

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