5

डीडीडी में, कुल रूट में एक भंडार हो सकता है। आइए ऑर्डर कुल और यह गैर-लगातार समकक्ष ऑर्डर रिपोजिटरी और लगातार समकक्ष ऑर्डरयूओडब्ल्यू है। हमारे पास उत्पाद संस्करण कुल है जो क्रम में उत्पादों की सूची ट्रैक करता है। इसमें उत्पाद VariantRepository और ProductVariantUoW हो सकता है।डीडीडी में, एक यूओडब्ल्यू प्रति रिपोजिटरी या बाउंड संदर्भ या लेनदेन?

आदेश और उत्पाद संस्करण का तरीका यह है कि ऑर्डर जारी होने से पहले, सूची की जांच की जाती है। यदि सूची है, तो ऑर्डरयूओडब्ल्यू.कॉमिट() को कॉल करके ऑर्डर जारी रहेगा। हां, उत्पादों की सूची अद्यतन करने के लिए ProductVariantUoW.Commit() को कॉल किया जाएगा।

अनजाने में चीजें खराब हो सकती हैं, उपयोगकर्ता ने उस संक्षिप्त समय में वही उत्पाद खरीदे हैं (इसे एक वेब ऐप के रूप में देखें जहां दो उपयोगकर्ता एक ही उत्पाद खरीद रहे हैं)। अब दूसरे उपयोगकर्ता के लिए पूरा लेनदेन अभी बनाए गए ऑर्डर को वापस कर विफल होना चाहिए। क्या मुझे ऑर्डर यूओडब्ल्यू को परिवर्तनों को रोलबैक करने के लिए कॉल करना चाहिए (ऑर्डर डीबी से हटाया जाना चाहिए)? या क्या मुझे UoW.Commit() दोनों लेनदेन के दायरे में संचालन करना चाहिए, इसलिए एक प्रतिबद्ध() में विफल होने से परिवर्तनों में कमी आएगी? या दोनों रिपॉजिटरीज़ (ऑर्डर, उत्पाद संस्करण) में केवल यूओडब्ल्यू होना चाहिए और इसमें केवल एक लेनदेन का दायरा होना चाहिए?

मैं कहकर कहानी कम कर सकता हूं कि लेन-देन कैसे संभाला जाता है जहां कई रिपोजिटरी शामिल हैं?

उत्तर

1

एक सवाल हम पूछ सकते हैं, जो निम्नलिखित कार्य कर रही है:

तरह से आदेश और ProductVariant काम है कि से पहले आदेश एक समान होती है, सूची को चेक किया गया है। यदि सूची है, तो आदेश ऑर्डरयूओडब्ल्यू.कॉमिट() को कॉल करके जारी रहेगा। हां, उत्पाद VariantUoW.Commit() उत्पादों के इन्वेंट्री को अद्यतन करने के बगल में कॉल किया जाएगा।

कुछ तर्क देते हैं कि इस तरह का काम सेवा परत में है, जो सेवा परत को एक ही लेनदेन में कुल वस्तुओं को पार करने की अनुमति देता है।

http://www.infoq.com/articles/ddd-in-practice के अनुसार:

कुछ डेवलपर्स डीएओ कक्षाएं जो एक गरीब डिजाइन है में लेनदेन के प्रबंधन के पसंद करते हैं। इसका परिणाम बहुत बढ़िया लेनदेन नियंत्रण है जो उपयोग मामलों के प्रबंधन की लचीलापन नहीं देता है जहां लेन-देन कई डोमेन ऑब्जेक्ट्स का विस्तार करता है। सेवा कक्षा लेनदेन को संभालना चाहिए; इस तरह से लेनदेन एकाधिक डोमेन ऑब्जेक्ट्स को फैलाता है, तो सेवा वर्ग अधिकांश उपयोग मामलों में लेन-देन का प्रबंधन कर सकता है क्योंकि सर्विस क्लास नियंत्रण प्रवाह को नियंत्रित करता है।

मुझे लगता है कि एक लेनदेन का उपयोग करने के विकल्प के रूप में, आप उत्पाद Variant का उपयोग करके सूची का दावा कर सकते हैं, और यदि आवश्यक सभी वस्तु वस्तुएं उपलब्ध हैं तो आप ऑर्डर कर सकते हैं। अन्यथा (यानी आप ऑर्डर के लिए आवश्यक सभी उत्पादों का दावा नहीं कर सकते हैं) आपको उस सूची को वापस करना होगा जिसे क्षतिपूर्ति लेनदेन का उपयोग करके सफलतापूर्वक दावा किया गया था।परिणाम यह है कि आदेश की असफल प्रतिबद्धता के मामले में, कुछ सूची अस्थायी रूप से अन्य आदेशों के लिए अनुपलब्ध दिखाई देगी, लेकिन लाभ यह है कि आप एक वितरित लेनदेन के बिना काम कर सकते हैं।

कोई भी कम नहीं, यह तर्क अभी भी सेवा परत में है, डीएओ कक्षाओं में नहीं।

+0

धन्यवाद एरिक। मुझे स्पष्ट करने दें कि जो भी मैंने मूल पोस्ट में वर्णित किया है वह ऐप सेवा परत में होता है, न कि डोमेन परत में। ऐप सेवा परत ऑर्डर सबमिट करने के लिए रिपोजिटरी, यूओडब्ल्यू ऑफ ऑर्डर और उत्पाद वैरिएंट को समन्वयित कर रही है। मूल पोस्ट में मेरा प्रश्न लेनदेन करने के बारे में है जब दो यूओडब्ल्यू उपलब्ध हैं? –

+0

मुझे लगता है कि आपको छोटे यूओडब्ल्यू को एक बड़े यूओडब्ल्यू में लिखने की आवश्यकता है जो उन्हें प्रभावी रूप से एक ही लेनदेन में बनाता है। Http://stackoverflow.com/a/11658021/471129 भी देखें। –

1

जिस तरह से आप काम की इकाई का उपयोग कर रहे हैं, वह थोड़ा बढ़िया लगता है। बस अगर आपने मार्टिन फाउलर के टेक को नहीं पढ़ा है: http://martinfowler.com/eaaCatalog/unitOfWork.html

कहा जा रहा है कि आप उपयोग-मामले स्तर पर लेनदेन को संभालना चाहते हैं। तथ्य यह है कि सूची की जांच अप-फ्रंट है, बस एक सुविधा (यूएक्स) है और विभिन्न बिट्स को जारी करते समय शेयर स्तर की जांच की जानी चाहिए। अपर्याप्त स्टॉक के लिए एक अपवाद उठाया जा सकता है।

लेनदेन अलगाव स्तर इस तरह सेट किया जाना चाहिए कि दो 'एक साथ' भागों को क्रमशः किया जाता है। तो जो भी स्टॉक स्तर को अद्यतन करने के लिए पहले मिलता है वह पहले 'जीत' जा रहा है। दूसरा तो अपवाद उठाएगा।

+0

धन्यवाद ईबेन। सूची की जांच सिर्फ एक यूआई चिंता नहीं है। यह व्यवसाय नियम के रूप में एक डोमेन चिंता हो सकती है। मैंने यह नहीं बताया कि समस्या में जो मुद्दा नहीं है जिसे मैं यहां संबोधित कर रहा हूं। –

+0

क्या हमारे पास केवल एक यूओडब्ल्यू होना चाहिए जो एक ही लेनदेन में ऑर्डर और उत्पाद संस्करण को अपडेट करने का पूरा लेनदेन करता है? जैसा कि आपने कहा था कि यूओडब्ल्यू मेरे मामले में दंडित है क्योंकि ऑर्डर रिपोजिटरी और उत्पाद वेरिएंट रिपोजिटरी दो अलग-अलग बाउंड संदर्भों में हैं। चूंकि वे अलग-अलग बीसी हैं, इसलिए उन्होंने अपनी खुद की रेपॉजिटरीज और यूओडब्ल्यू की है। –

+0

मैं देखता हूं। ऑर्डर प्रक्रिया होने के बाद विभिन्न बीसी चीजें बदलती हैं। आपको प्रक्रिया और राज्य का ट्रैक रखने की आवश्यकता होगी। प्रक्रिया को पूरा करने के लिए आपको स्टॉक को 'आरक्षित' या 'जारी' करने में सक्षम होना चाहिए। स्टॉक जारी करने के लिए धारावाहिक (लेनदेन-वार) होगा और यदि यह विफल हो जाता है तो आपको आदेश रद्द करना होगा। रद्द करने की प्रक्रिया भी व्यापार पर निर्भर करती है क्योंकि आप शायद उपयोगकर्ता को बैक-ऑर्डर पर आइटम रखने के लिए एक लिंक के साथ एक ई-मेल भेजना चाहें। –

1

यदि आप एक यूओडब्ल्यू का उपयोग कर सकते हैं तो ऐसा करें, क्योंकि यह आसान है।

यदि आपकी रिपॉजिटरी विभिन्न डीबी पर हैं (या शायद एक फ़ाइल-आधारित है और अन्य नहीं हैं) तो आपको एकाधिक यूओडब्ल्यू का उपयोग करने के लिए मजबूर होना पड़ सकता है, लेकिन फिर आप रोल-बैक कमांड भी लिख रहे हैं, क्योंकि यदि UoW1 SqlRepo OK में परिवर्तन सहेजता है, लेकिन फिर UoW2 FileRepo में परिवर्तनों को सहेजने में विफल रहता है तो आपको रोलबैक SqlRepo की आवश्यकता होती है। यदि आप इससे बच सकते हैं तो सभी रोलबैक कमांड सामान लिखना परेशान न करें!

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