2011-11-15 16 views
5

क्या एक XML- आधारित भंडार के लिए एक बेहतर दृष्टिकोण होगा:एक्सएमएल रिपोजिटरी; सहेजें करने के लिए() या सहेजें करने के लिए नहीं()

1) भंडार करने के लिए प्रत्येक कॉल पर अंतर्निहित एक्सएमएल दस्तावेज़ में परिवर्तन सहेजें ...

public class XmlRepository1 
{ 
    private XDocument xDocument; 

    public void CrudOp() 
    { 
     // Perform CRUD operation... 

     // Call Save() 
     xDocument.Save(path); 
    } 
} 

या

2) एक SaveChanges() विधि के साथ अंत उपयोगकर्ता प्रदान करें ...

public class XmlRepository2 
{ 
    private XDocument xDocument; 

    public void CrudOp() 
    { 
     // Perform CRUD operation... 

     // DON'T call save 
    } 

    // Provide a SaveChanges() method to the end-user... 
    public void SaveChanges() 
    { 
     xDocument.Save(path); 
    } 
} 

मेरा झुकाव विकल्प 1 की तरफ झुकता है, क्योंकि SaveChanges() विधि प्रदान करना वास्तव में एक रिपॉजिटरीज जिम्मेदारी की तरह प्रतीत नहीं होता है। हालांकि, मैं दो कारणों से इस निर्णय का दूसरा अनुमान लगा रहा हूं:

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

बी) विकल्प 2 "बैच-जैसी" प्रतिमान प्रदान करता है, जिसे मैं विभिन्न कारणों से अधिक लचीला होने के रूप में देख सकता हूं।

+2

(ए) के लिए एक टिप्पणी के रूप में, आपको कभी भी एक आंशिक रूप से उत्परिवर्तित स्थिति में अपनी भंडार नहीं छोड़नी चाहिए, इससे कोई फर्क नहीं पड़ता कि क्या हुआ है। –

+0

@ मैथ्यू- मुझे स्पष्टीकरण दें ... भंडार आंशिक रूप से उत्परिवर्तित वस्तुओं को नहीं छोड़ेगा। लेकिन यदि कोई अंत उपयोगकर्ता किसी ऑब्जेक्ट की स्थिति को बदलता है, तो Repository.Update (obj) को कॉल करता है और कॉल विफल हो जाता है ... (आप देखते हैं कि मैं इसके साथ कहां जा रहा हूं?) मैं यहां पर अधिक भयावह हो सकता हूं, मैं वास्तव में डॉन करता हूं पता नहीं है ... – Didaxis

उत्तर

3

कुछ प्रकार के लेनदेन समर्थन (आपके दूसरे एप्लिकेशन के करीब) जोड़ने पर विचार करें।

public class XmlRepository2 
    { 
    public void CrudOp() 
    { 
     // DON'T call save 
    } 

    public MakeTransacedChanges(Action<XmlRepository2> makeChanges) 
    { 
     try{ 
      makeChanges(this); 
      saveChanges(); 
     } 
     catch (RepositoryException e) 
     { 
      //revert changes 
     } 
    } 

    private void saveChanges() 
    { 
     xDocument.Save(path); 
    } 
    } 
+0

+ 1 चीजों को कुछ बार देखने के बाद, और आपके उत्तर पर विचार करने के बाद, मैं इस विचार को और अधिक पसंद कर रहा हूं। मुझे अपने कार्यक्रम के संदर्भ में थोड़ा और इसके बारे में सोचना होगा, और सभी प्रभाव ... कुल मिलाकर, यह एक अच्छा विचार है – Didaxis

1

मैं कुछ बदलाव गलत होने पर अपने परिवर्तनों को वापस करने का मौका पाने के लिए भंडार में अलग सेव विधि रखना पसंद करता हूं।

मुझे यह आलेख Repositories and the Save Method मिला। उम्मीद है कि यह मदद करेगा।

+0

लिंक साझा करने के लिए धन्यवाद। – Didaxis

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