2010-08-26 10 views
5

सबसे पहले, कुछ पृष्ठभूमि: मैं एएसपी.नेट एमवीसी 2 और एनएचबेर्नेट के लिए नया हूं। मैं अपना पहला एप्लिकेशन शुरू कर रहा हूं और मैं एनएचबीर्नेट का उपयोग करना चाहता हूं, क्योंकि मैं जेएसपी + स्ट्रैट्स 1 + हाइबरनेट वेब अनुप्रयोगों से आया हूं।एएसपी.नेट एमवीसी 2 आवेदन में एनएचबीर्नेट लेनदेन कब करें?

कोई भी इस बारे में बात नहीं कर रहा है, इसलिए मुझे लगता है कि यह बहुत स्पष्ट होना चाहिए। फिर भी मैं अपने सिर को खरोंच करता हूं क्योंकि मुझे निम्न समाधानों को पूरा करने वाला कोई समाधान नहीं मिल रहा है:

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

2) जब कोई डेटाबेस अपवाद होता है (पीके उल्लंघन, अनूठा उल्लंघन, जो भी हो) मैं उस अपवाद को कैप्चर करना चाहता हूं, अपना लेनदेन रोलबैक करना चाहता हूं और उपयोगकर्ता को एक स्पष्ट संदेश देता हूं: यदि यह पीके उल्लंघन था, तो वह संदेश, और सभी अखंडता त्रुटियों के साथ ही।

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

तो उपयोगकर्ता वास्तव में सफलता पृष्ठ देखता है जब वास्तविकता लेनदेन को घुमाया गया था। इससे बचने के लिए मुझे सभी अखंडता अपवादों को रोकने के लिए जावा में बहुत सारी डेटा अखंडता जांच लिखनी है, क्योंकि मैं उन्हें सही तरीके से संभाल नहीं सकता था। यह बुरा है क्योंकि मैं इसे डेटाबेस में छोड़ने के बजाय काम कर रहा हूं (या शायद मैं गलत हूं और मुझे हमेशा अपने ऐप में यह डेटा अखंडता कोड लिखना होगा?)।

तो मुझे आईएचटीपी मॉड्यूल इंटरफेस मिला है जो मुझे लगता है कि एक javax.servlet.Filter (मुझे गलत है अगर सही है) के रूप में बहुत ही अवधारणा है, इसलिए मुझे लगता है कि मैं वही कर सकता हूं फिर से समस्या

यह सुनिश्चित करने के लिए कि मेरे लेन-देन परमाणु हैं, और जब वे अपवाद फेंकते हैं तो मैं अपना काम कहां रखूं, मैं उन्हें पकड़ सकता हूं और अपना गंतव्य पृष्ठ बदल सकता हूं और उपयोगकर्ता को एक व्यापक संदेश दे सकता हूं?

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

क्या कोई बेहतर तरीका है?

उत्तर

0

खैर इस बारे में सोच और सहकर्मियों मैं एक समाधान है कि लगभग सभी मेरी आवश्यकताओं को पूरा कर आए हैं के साथ यह चर्चा की ।

मैंने अपनी जावा परियोजनाओं के साथ समाधान लागू किया और यह बहुत अच्छा काम किया। मैं सिर्फ विचार को धक्का दूंगा ताकि सभी इसे किसी भी रूपरेखा के भीतर उपयोग कर सकें।

समाधान एक प्रयास-पकड़ ब्लॉक के अंदर नियंत्रक विधि की अंतिम पंक्ति में प्रतिबद्ध कॉल डालने में शामिल है। यदि कोई बाधा अपवाद होता है तो आप उल्लंघन की बाधा का नाम प्राप्त कर सकते हैं। नाम के साथ आप उपयोगकर्ता को बता सकते हैं कि क्या गलत हुआ। मैंने उपयोगकर्ता को उस बाधा को उल्लंघन करने के लिए संदेश संग्रहीत करने के लिए एक प्रॉपर्टी फ़ाइल का उपयोग किया था जिसमें बाधा का उल्लंघन किया गया था। गुण फ़ाइल की कुंजी बाधाओं के नाम हैं और मान बाधा उल्लंघन संदेश हैं।

यो एक विधि के लिए प्रतिबद्ध-हैंडल_एक्सप्शन-find_constraint_message को दोबारा कर सकता है, मैंने यही किया।

अब यह डेटाबेस अखंडता की जांच करने के लिए कोड लिखने की मेरी समस्या हल करता है और मेरा मानना ​​है कि यह गुण फ़ाइल में बाधा उल्लंघन संदेशों के साथ बहुत सुंदर है। अब, मुझे अभी भी यह विचार पसंद नहीं है कि मेरे नियंत्रकों को प्रतिबद्धता को कॉल करने की आवश्यकता है, लेकिन यह अखंडता जांच लिखने से बेहतर तरीका है कि डेटाबेस पहले से ही करता है।

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

टिप्पणियां स्वागत से अधिक हैं। धन्यवाद।

+0

क्या आप कोड में एक उदाहरण दिखा सकते हैं? यह सहायक होगा। –

1

यदि आप एएसपी.नेट एमवीसी का उपयोग कर रहे हैं, तो आप उसी प्रभाव को प्राप्त करने के लिए ActionFilter का उपयोग कर सकते हैं।

कुछ की तरह (यह एक साथ मेरी वास्तुकला का अंतर टुकड़े से काट दिया है):

public class TransactionalAttribute : ActionFilterAttribute, IAuthorizationFilter, IExceptionFilter 
{ 

    ITransaction transaction = NullTransaction.Instance; 
    public IsolationLevel IsolationLevel { get; set; } 

    public TransactionalAttribute() 
    { 
     IsolationLevel = IsolationLevel.ReadCommitted; 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     try 
     { 
      transaction.Commit(); 
      transaction = NullTransaction.Instance; 
     } 
     catch (Exception exception) 
     { 
      Log.For(this).FatalFormat("Problem trying to commit transaction {0}", exception); 
     } 

    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (transaction == NullTransaction.Instance) transaction = UnitOfWork.Current.BeginTransaction(IsolationLevel); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Result != null) return; 

     transaction.Commit(); 
     transaction = NullTransaction.Instance; 
    } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     transaction = UnitOfWork.Current.BeginTransaction(IsolationLevel); 
    } 

    public void OnException(ExceptionContext filterContext) 
    { 
     try 
     { 
      transaction.Rollback(); 
      transaction = NullTransaction.Instance; 
     } 
     catch (Exception exception) 
     { 
      Log.For(this).FatalFormat("Problem trying to rollback transaction {0}", exception); 
     } 
    } 

    private class NullTransaction : ITransaction 
    { 
     public static ITransaction Instance { get { return Singleton<NullTransaction>.Instance; } } 

     public void Dispose() 
     { 

     } 

     public void Commit() 
     { 
     } 

     public void Rollback() 
     { 
     } 
    } 
} 
संबंधित मुद्दे