2008-12-13 11 views
28

मैं वर्तमान में HybridSessionBuilder वर्ग जेफरी पलेर्मो के ब्लॉग पोस्ट पर पाया के साथ चारों ओर खेल रहा हूँ:NHibernate सत्र प्रबंधन

http://jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/

इस वर्ग का उपयोग करना, मेरी भंडार इस तरह दिखता है:

public class UserRepository : IUserRepository 
{ 
    private readonly ISessionBuilder _sessionBuilder; 

    public UserRepository(ISessionBuilder sessionBuilder) 
    { 
     _sessionBuilder = sessionBuilder; 
    } 

    public User GetByID(string userID) 
    { 
     using (ISession session = _sessionBuilder.GetSession()) 
     { 
      return session.Get<User>(userID); 
     } 
    } 
} 

क्या यह एनएचबीर्नेट सत्र/कारखाने के प्रबंधन के बारे में जाने का सबसे अच्छा तरीका है? मैंने यूनिट ऑफ वर्क के बारे में चीजें सुनी हैं और प्रति वेब अनुरोध सत्र बनाया है और अंत में इसे फ्लश कर दिया है। जो मैं बता सकता हूं, मेरा वर्तमान कार्यान्वयन इनमें से कोई भी नहीं कर रहा है। यह मूल रूप से सत्र कारखाने से सत्र को पकड़ने और प्रश्नों को चलाने के लिए इसका उपयोग करने के लिए रिपोजिटरी पर निर्भर है।

क्या इस तरह डेटाबेस एक्सेस करने के लिए कोई समस्या है?

+1

नुकसान के बारे में निश्चित नहीं है, लेकिन आप के माध्यम से Rhino.Commons का उपयोग कर कार्य पद्धति की इकाई के एक कार्यान्वयन की जांच कर सकते स्टीव Bohlen के www.autumnofagile.net ... वह NHibernate, विंडसर और राइनो के साथ एक MVC एप्लिकेशन बनाने है .Commons ... यह एक महान श्रृंखला – Webjedi

उत्तर

37

आपको अपने आईएसशन को एक प्रयोग कथन में लपेटना नहीं चाहिए - रिपोजिटरी कन्स्ट्रक्टर (निर्भरता इंजेक्शन) में ISessionBuilder को पारित करने का बिंदु यह है कि कॉलिंग कोड ISession के जीवन चक्र को नियंत्रित करने के लिए ज़िम्मेदार है। इसे उपयोग में लपेटकर, निपटान() को ISession पर बुलाया जाता है और आप ऑब्जेक्ट सदस्यों को आलसी लोड करने में सक्षम नहीं होंगे या इसे जारी रखेंगे।

हम रिपोजिटरी कन्स्ट्रक्टर को बस एक ISession में गुजरकर कुछ ऐसा करते हैं। श्री पालेर्मो का कोड, जैसा कि मैं इसे समझता हूं, बस आइसिया के आलसी प्रारंभिक जोड़ता है। मुझे नहीं लगता कि इसकी आवश्यकता है क्योंकि यदि आप इसका उपयोग नहीं करेंगे तो आप एक भंडार क्यों नया करेंगे?

+0

अच्छा जवाब, आईडी अगर मैं कर सकता हूं तो इसे दो बार वोट दें :) – UpTheCreek

10

एएसपी.NET एमवीसी के साथ आप यह सुनिश्चित करना चाहते हैं कि सत्र के जीवन को आपके नियंत्रक पर एक्शन विधि के दौरान बनाए रखा जाए, क्योंकि एक बार आपका नियंत्रक बाहर निकल गया है, तो आपके सभी डेटा एकत्र किए जाने चाहिए। मुझे यकीन नहीं है कि यह तंत्र उसमें मदद करेगा या नहीं।

आप एस # एआरपी आर्किटेक्चर में देखना चाहते हैं जो एनएचबीनेटनेट का उपयोग करके एएसपी.NET एमवीसी अनुप्रयोग बनाने के लिए पुस्तकालयों और मार्गदर्शन का एक सेट है। http://code.google.com/p/sharp-architecture/

+0

हम सीयू हैं ग्लोबल.एएसएक्स (सीएसएस और जेएस इत्यादि को अनदेखा कर रहे हैं) में एक प्रारंभिक अनुरोध और अंतिम अनुरोध कॉल का उपयोग करके इस सत्र जीवन को क्रमशः प्रबंधित करना कार्य कार्रवाई के एक इकाई के साथ हर कार्य को सजाना नहीं चाहता था। – Perhentian

+1

मैं पहले अनुरोध का उपयोग कर रहा था लेकिन फिर जब कोई गंभीर त्रुटि उत्पन्न हो जाती है तो अनुरोध पहले ही समाप्त हो चुका है पृष्ठ को प्रस्तुत किया गया है और मुझे त्रुटि को संभालने का एक साफ तरीका नहीं दिख रहा था, फिर उपयोगकर्ता को एक सामान्य पृष्ठ पर भेजना था। जब आप नियंत्रक से दृश्य में जाते हैं, तो मैं सत्र के स्पष्ट नज़दीक (या कम से कम लेनदेन को कम करने पर) पसंद करता हूं। – JoshBerke

1

मैं एनएचबीरनेट के प्रत्येक डेटा अनुरोध पर सत्र खोल और बंद नहीं करता। मैं यूनिट ऑफ वर्क लाइब्रेरीज़ का उपयोग करूंगा जो कई अन्य सुझाव देते हैं या कुछ और पढ़ते हैं। NHForge.org शुरू हो रहा है और मेरा मानना ​​है कि एक सामान्य वेब अनुप्रयोग के लिए एनएचबीरनेट स्थापित करने पर कुछ अभ्यास हैं।

एनएचबर्ननेट से प्राप्त "ओह वाह जो शांत क्षण है" में से एक विकास के दौरान आलसी लोडिंग संग्रह का लाभ उठा रहा था। यह एक साफ अनुभव था कि कुछ जुड़े ऑब्जेक्ट्स पर डेटा प्रदर्शित करने के लिए उन सभी जुड़ने की ज़रूरत नहीं है।

इस तरह के सत्र को बंद करके, उपर्युक्त परिदृश्य संभव नहीं होगा।

लेन-देन के साथ कुछ भी हो रहा है।

3

यह वह सेटअप है जिसे मैंने और अधिक शोध करने के बाद उपयोग किया था।महान काम करने के लिए लगता है और वहाँ बाहर सबसे गाइड की तरह स्थिर फ़ाइल अनुरोध पर एक ISession बनाने की है कि कष्टप्रद आदत नहीं है:

http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/

+0

स्थिर फ़ाइल अनुरोधों के लिए सत्र खोलने का क्या कारण है? –

+0

अधिकतर समाधान अनुरोध हैंडलर का उपयोग करते हैं, क्योंकि आईआईएस 7 एकीकृत पाइपलाइन में सबकुछ संभालता है, स्थिर संसाधनों के अनुरोधों को केवल पृष्ठ अनुरोधों से ही संभालता है। इसलिए, हैंडलर प्रत्येक अनुरोध के लिए एक निबर्ननेट लेनदेन/सत्र को स्थिर करता है जिसमें स्थिर संसाधनों के अनुरोध शामिल हैं। – Ted

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