c# - Handle Database Transactions & Exceptions in TreeView with Multi-Tier MVVM -
पृष्ठभूमि: पेड़ को कैसे रखा जा सकता है इसका एक उदाहरण है:
मेरे पास WPF TreeView के आस-पास एक कस्टम उपयोगकर्ता नियंत्रण है। मैं MVVM पैटर्न का उपयोग कर रहा हूं और TreeNode
वर्ग और कई व्यूअर किए गए मॉडल जैसे LocationNode, LocationFolder, PersonNode, PersonFolder, CollectionNode, CollectionFolder आदि का आधार दृश्य मॉडल है।
- संग्रह फ़ोल्डर -> संग्रह नोड -> स्थानफ़ोल्डर -> स्थाननोड -> स्थाननोड - जब मैं ड्रैग एंड ड्रॉप ऑपरेशंस करता हूं, तो प्रत्येक वर्ग व्यावसायिक तर्क को संभालता है, यानी अगर मैं ड्रॉप करता / करती हूं
PersonNode
पर एक CollectionNode
, CollectionNode
दृश्य मॉडल में तर्क है कि यह कैसे PersonNode
को जोड़ने के लिए इसका बच्चा है PersonFolder
।
समस्या:
सब कुछ बहुत अच्छा काम करता है, मैं पूरे स्थान पर खींच और ड्रॉप कर सकता हूं, और निहित कक्षाओं में कोड को अच्छी तरह से निहित किया गया है। यदि मुझे एक अतिरिक्त बूंद नियम जोड़ने की आवश्यकता है, तो मैं इसे उपयुक्त ड्रॉप लक्ष्य दृश्य मॉडल में जोड़ता हूं।
समस्या तब होती है जब PersonNode
को PersonFolder
में जोड़ दिया जाता है, मुझे यह दर्शाता है कि अंतर्निहित व्यक्ति < / कोड> मॉडल अब भी एक नया
संग्रह
में है
वर्तमान में, वृक्ष में प्रत्येक दृश्य मॉडल की वर्तमान डेटाबेस सत्र / लेनदेन तक पहुंच होती है और डालने / सहेजने का कार्य कर सकता है। लेकिन यह अपवादों को पकड़ने और त्रुटियों को अत्यंत दोहराता बनाता है, मेरे अपवाद हैंडलिंग कोड को मेरे सभी दृश्य मॉडलों पर दोहराया जा रहा है। क्या मेरे डेटाबेस इंटरैक्शन को संभालने के लिए MVVM में कोई बेहतर तरीका है?
मेरे ड्रॉप
से मेरे कोड में से एक कोड स्निपेट PersonFolder
// एक नया दृश्य मॉडल बनाएं व्यक्ति और इसे मेरे बच्चों को जोड़ें- बच्चा.जोड़ा (नया लोगनोड (छोड़ा गया)); // इस व्यक्ति के लिए संग्रह में एक नई प्रविष्टि बनाएँ संग्रह प्रविष्टि प्रविष्टि = नया संग्रह प्रविष्टि (); प्रविष्टि.एन्टीटी = छोड़ा गया; प्रविष्टि। संकलन = _collection; // नया प्रविष्टि (var transaction = _uow.BeginTransaction (IsolationLevel.Serializable)) का उपयोग कर सहेजें (// सत्र के लिए प्रवेश जोड़ें _uow.Add (प्रविष्टि); // सत्र को बचाने _उओ। सेव चेंज (); // [1] // कॉमिट लेनदेन लेनदेन.संचार (); // [2]}
[1] और [2] में अपवादों को फेंकने की क्षमता है और इसे प्रयास / पकड़ ब्योरे में संभाला जाना चाहिए। हालांकि, मैं अपने सारे विचार मॉडल, किसी भी सुझाव में अपने सभी अपवाद निपटने का नकल नहीं करना चाहता हूं?
मुझे लगता है कि मैं हमेशा सिंगलटन को सत्र और अपवाद से निपटने में शामिल कर सकता हूं और मेरी नई संस्थाओं को कि?
मैं मान रहा हूँ कि आपके अंतिम कोड ब्लॉक का चर हिस्सा है:
_uow.Add (प्रविष्टि);
... तो कुछ मामलों में आप वास्तव में उस स्थान पर होने वाले अधिक या कम क्रियाओं की अपेक्षा कर सकते हैं।
मुझे लगता है कि यह " "।
असल में बस एक
एक्शन & lt; T & gt;
किसी अन्य स्थान पर (सिंगलटन, जो कुछ भी) जो एक लेन-देन को खोलता है, आपके क्रियाकलाप के संदर्भ (_uow) को पास करता है, और फिर लेन-देन करता है, और आपके अपवाद तर्क को संभालता है। आपका कोड ऐसा दिखेगा:
// व्यक्ति के लिए एक नया दृश्य मॉडल बनाएं और इसे मेरे बच्चों को जोड़ने दें। जोड़े (नया व्यक्ति नोड (वगलप्रुट)); // इस व्यक्ति के लिए संग्रह में एक नई प्रविष्टि बनाएँ संग्रह प्रविष्टि प्रविष्टि = नया संग्रह प्रविष्टि (); प्रविष्टि.एन्टीटी = छोड़ा गया; प्रविष्टि। संकलन = _collection; SomeSingleton.Execute (ओ => ओ। जोड़ें (प्रविष्टि));
Comments
Post a Comment