2010-03-23 8 views
9

मेरे पास निम्न कोड है जो एक लेनदेन में है। मुझे यकीन नहीं है कि मुझे कब/कब काम की अपनी इकाई का काम करना चाहिए। जैसे -निम्नलिखित कोड में कौन सी पंक्ति मुझे काम की मेरी इकाई को प्रतिबद्ध करनी चाहिए?

उद्देश्य पर, मैं मैं Respoistory किस प्रकार उपयोग कर रहा हूँ का उल्लेख नहीं किया गया है। LINQ-टू-Sql, इकाई की रूपरेखा 4, NHibernate, आदि

कोई जानता है जहां, वे कृपया उसका वर्णन क्यों उन्होंने कहा है, जहां? (मैं उदाहरण के माध्यम से पैटर्न को समझने की कोशिश कर रहा हूं, क्योंकि मेरे कोड को काम करने के विरोध में)।

यहाँ मैं क्या कर लिया है: -

using 
(
    TransactionScope transactionScope = 
     new TransactionScope 
     (
      TransactionScopeOption.RequiresNew, 
      new TransactionOptions 
       { IsolationLevel = IsolationLevel.ReadUncommitted } 
     ) 
) 
{ 
    _logEntryRepository.InsertOrUpdate(logEntry); 
    //_unitOfWork.Commit(); // Here, commit #1 ? 

    // Now, if this log entry was a NewConnection or an LostConnection, 
    // then we need to make sure we update the ConnectedClients. 
    if (logEntry.EventType == EventType.NewConnection) 
    { 
     _connectedClientRepository.Insert(
      new ConnectedClient { LogEntryId = logEntry.LogEntryId }); 
     //_unitOfWork.Commit(); // Here, commit #2 ? 
    } 

    // A (PB) BanKick does _NOT_ register a lost connection, 
    // so we need to make sure we handle those scenario's as a LostConnection. 
    if (logEntry.EventType == EventType.LostConnection || 
     logEntry.EventType == EventType.BanKick) 
    { 
     _connectedClientRepository.Delete(
      logEntry.ClientName, logEntry.ClientIpAndPort); 
     //_unitOfWork.Commit(); // Here, commit #3 ? 
    } 

    _unitOfWork.Commit(); // Here, commit #4 ? 
    transactionScope.Complete(); 
} 
+1

मुझे लगता है कि आप काम संभाल लेन-देन की यूनिट ... –

+0

मुझे लगता है अपने UOW TransactionScope के बारे में पता है यह बताने के लिए होता है। यह जानना चाहिए कि जब आप लेनदेन करते हैं तो खुद को कब प्रतिबद्ध करना है। – Ryan

+0

निश्चित रूप से यह इस बात पर निर्भर करता है कि '_unitOfWork' कहां घोषित किया गया है? –

उत्तर

0

# 4 पर प्रतिबद्ध के बाद सभी सब खजाने को संचालन किया जाता है। यदि आप पहले से प्रतिबद्ध हैं, तो उस कॉल के बाद किए गए परिवर्तन प्रतिबद्ध नहीं हैं।

+0

शायद मुझे कुछ याद आ रहा है। _unitOfWork.Commit() कोड में बाद में फिर से बुलाया गया है? यह हो सकता है कि हमारा भ्रम झूठ बोलता है यदि यूओडब्ल्यू लेन-देन-जागरूक है, इसलिए इससे कोई फर्क नहीं पड़ता कि जब आप Commit() को कॉल करते हैं।अन्यथा, यदि यह लेनदेन से अवगत नहीं है, और रिपॉजिटरीज यूओडब्ल्यू और कमिट() से बंधे हैं, तो फिर से कॉल नहीं किया जाता है, तो काम केवल कमेटी() कहलाए जाने से पहले और बाद में भंडार में जो कुछ भी बदला गया था उसे संशोधित करेगा। –

+0

मैंने अभी पुष्टि की है कि यूओडब्ल्यू लेनदेन से अवगत है -> यह अपना खुद का प्रतिबद्ध लेनदेन बनाता है, इसलिए मुझे मेरा करने की आवश्यकता नहीं है। यह अब पूर्ण 100% समझ में आता है :) प्रतिबद्धता एक ट्रैन शुरू करती है, क्या सभी परिवर्तन (आखिरी प्रतिबद्धता के बाद से) .. इसे डीबी पर धक्का देता है .. फिर वह ट्रांस करता है। चीयर्स! –

0

यह मानते हुए कि आपके डेटा की दुकान बताए है आईडी, आप प्रतिबद्ध करने के लिए है # 1 (NHibernate के साथ तुम भी फ्लश चाहिए), तो कम से अंत # 4।

3

इस सवाल का जवाब देने के लिए एक अच्छा प्रारंभिक बिंदु उद्यम वास्तुकला के पैटर्न से कार्य की इकाई की परिभाषा (http://martinfowler.com/eaaCatalog/unitOfWork.html) है:

एक व्यापार लेनदेन से प्रभावित वस्तुओं की एक सूची रखता और से बाहर लेखन निर्देशांक परिवर्तन और समवर्ती समस्याओं का संकल्प।

काम की अपनी यूनिट की सीमाओं अपने व्यापार लेनदेन की सीमाओं द्वारा परिभाषित कर रहे है - इस मामले कि डेटाबेस लेनदेन की सीमाओं का पर्याय बन गया है में (लेकिन एक लंबे चल व्यापार लेनदेन के मामले में जो एक से अधिक तक फैला अनुरोध जो मामला नहीं हो सकता है)।

परिभाषा से पीछे की ओर काम करते हुए ऊपर दिखाए गए कोड का टुकड़ा की मेरी समझ के आधार पर, आप व्यापार लेनदेन के अंत में काम की इकाई के लिए प्रतिबद्ध होना चाहिए (# 4)।

एक तरफ, आपके डेटाबेस लेनदेन के क्षेत्र हमेशा आपके यूओडब्ल्यू के दायरे से कम होना चाहिए (यानी टीएक्स स्कोप यूओडब्ल्यू.बजिन() और यूओडब्ल्यू.कॉमिट() को कॉल के बीच रहता है। यदि आपका यूओडब्ल्यू कई डेटाबेस लेन-देन फैलाता है तो आप आंतरिक लेनदेन में से एक विफल होने पर यूओडब्ल्यू को "पुनर्वित्त" करने के लिए एक क्षतिपूर्ति लेनदेन का उपयोग करेंगे। इस उदाहरण में, और विशेष रूप से अपने UOW UoW.Begin() और UoW.Commit पर उसके अपने डेटाबेस लेनदेन सीमाओं पैदा कर रही है, तो() मैं हटा इस रूप में लेन-देन गुंजाइश बस कोड को अनावश्यक शोर जोड़ रहा है।

+0

ग्रेट उत्तर :) और रिकॉर्ड के लिए, ईएफ वास्तव में हुड के नीचे करता है, जब आप * सबमिटChanges() *। –

+0

हाँ। एनएच में आईएसएशन इंस्टेंस प्रभावी रूप से यूओडब्लू और आईआईआरसी है, यह निर्धारित करने के लिए संबंधित लेनदेन का उपयोग करता है कि फ्लश की आवश्यकता होती है - लेकिन मुझे इस पर पूरी तरह से यकीन नहीं है इसलिए इसे बैंक में न लें =) – Neal

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

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