2010-09-18 16 views
9

में लेन-देन प्रबंधन मैं एक HttpModule में अपने NHibernate सत्र और लेनदेन के प्रबंधन के लोगों के लिए वेब पर कई कार्यान्वयन देखा है।NHibernate सत्र और HttpModule

HttpModule:

  1. अनुरोध
  2. एक सौदे
  3. में पूरे अनुरोध लपेटता के शुरू में एक सत्र बनाता अनुरोध के अंत में लेन-देन करता है

लोग इस रणनीति का उपयोग करते हैं कि वे किस तरह इस परिदृश्य पर संभाल रहे हैं:

  1. अनुरोध आता है
  2. डेटाबेस से वस्तु पुनः प्राप्त करने में
  3. अद्यतन वस्तु
  4. वस्तु विफल रहता सत्यापन वस्तु अभी भी कायम हैं क्योंकि लेनदेन HttpModule में प्रतिबद्ध है करने के लिए
  5. बदल जाता है।

ऐसा लगता है कि उपरोक्त परिदृश्य में लेनदेन को रोलबैक करने का कोई अच्छा तरीका नहीं है। एकमात्र योजना जिसके साथ मैं आ सकता हूं:

  1. मेरी सत्यापन को इस तरह से लिखें क्योंकि यह मेरी डोमेन ऑब्जेक्ट को अपडेट करने से पहले सफल होने की गारंटी है (मेरे डोमेन मॉडल से मेरा सत्यापन लेता है)।
  2. मेरे लेनदेन मेरी व्यापार तर्क के करीब का प्रबंधन और दूर एक HttpModule में पारदर्शी ढंग से यह कर के विचार फेंक देते हैं। (मैंने देखा है काफी कुछ पदों यह सलाह देते हैं)

के रूप में देखकर इतने सारे लोगों HttpModule दृष्टिकोण मैं आशा करती हूं वहाँ इस परिदृश्य है कि मैं के बारे में सोचा नहीं किया है के प्रबंधन की एक तीसरा रास्ता है ज़रिये जुड़े हुए हैं ?

+0

की त्रुटि घटना मैं भी हाल ही में एक ही सवाल की बात आती है उपयोग कर सकते हैं। मैं कुछ परियोजनाओं पर एनएचबर्ननेट से शुरू करता हूं। मेरा अंतिम दृष्टिकोण आईओसी के लिए ऑटोफैक का उपयोग कर रहा है और सत्रों के लिए HttpRequestScope का उपयोग कर रहा है। और व्यापार भंडार स्तर पर सभी लेनदेन संचालन। शायद यह सबसे अच्छा नहीं है, लेकिन यह अभी के लिए ठीक काम कर रहा है .. – Elph

+0

बजाय इकाई पर लागू किए परिवर्तनों को सत्यापित करने के परिवर्तन सत्यापित किया जा रहा बहुत आसान है। – Paco

+0

क्या आपको इसका उत्तर मिला? – Rippo

उत्तर

2

आप वैश्विक अपवाद संचालन किसी तरह का उपयोग कर सकते हैं। अब मैं System.AppDomain.CurrentDomain.UnhandledException का उपयोग कर रहा हूं। इस हैंडलर में आप Transaction.Rollback() को कॉल करना होगा; और कुछ ध्वज स्थापित करने वाले कंडिसीडर (जो केवल वर्तमान अनुरोध के दौरान ही रहता है) जो आपको इंगित करेगा कि आपको अपना लेनदेन करने या वापस रोल करने की आवश्यकता है। यह कोड को और स्पष्ट कर सकता है।

संपादित Alternativly आप HttpApplication

public class HelloWorldModule : IHttpModule 
{ 
    void Init(HttpApplication application) 
    { 
     application.BeginRequest += 
      (new EventHandler(this.Application_BeginRequest)); 
     application.EndRequest += 
      (new EventHandler(this.Application_EndRequest)); 
     //this is it 
     applicaiton.Error += 
      (new EventHandler(this.Application_Error)); 
    } 
संबंधित मुद्दे