लेन-देन के साथ डीबी-लॉजिक से बिजनेस लॉजिक को अलग करना


11

आर्किटेक्चर

हमारे आवेदन में तीन परतें हैं। एक बाहरी एपीआई प्रदान करने के लिए सेवा परत। हमारे व्यापार तर्क के लिए बीओ परत, और हमारे डेटाबेस कनेक्शन के लिए एक डीएओ परत।

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

"एक फ़ोल्डर संपादित करें जब एक फ़ाइल संपादित हो जाती है" -चुनाव विशुद्ध रूप से व्यावसायिक तर्क है। तो इसका मतलब यह है कि यह बीओ-परत में है। हालाँकि, हम अपने डेटाबेस के लिए Objectify का उपयोग करते हैं, इसलिए लेन-देन शुरू करने के लिए हमें toy ()। Transact (...) की आवश्यकता होती है। अगर हम इस फ़ंक्शन को BO लेयर में कहते हैं, तो यह हमारे डिज़ाइन को तोड़ देता है क्योंकि हमारे Business लेयर में डेटाबेस विशिष्ट कॉल (Objectify) होंगे।

इस समस्या के लिए एक स्वच्छ समाधान क्या होगा?


लेन-देन की समस्या के कारण FileBOकॉल नहीं कर सकते FolderBO.edit(newDate)?
चित्तीदार

java में c # TransactionScope का इक्विलेंट नहीं है?
ईवन

जावा में, लेनदेन का दायरा आपके द्वारा उपयोग किए जाने वाले ढांचे पर निर्भर करता है। जेईई में इसे ऐप सर्वर द्वारा प्रबंधित किया जा सकता है, लेकिन आमतौर पर इसे परिभाषित किया जाता है और स्प्रिंग (vía एनोटेशन, xml, ...) जैसे घोषित रूप से वाया फ्रेमवर्क को प्रबंधित किया जाता है
Laiv

अपने आवेदन के विभिन्न "परतों" को कार्यात्मक रूप से स्वतंत्र / एक दूसरे से अनभिज्ञ बनाने की कोशिश करने के बारे में कम चिंता करें। इस विचार को अपनाएं कि आपका कोड उस आर्किटेक्चर के लिए बनाया गया है जो इसका समर्थन करता है और इसके बजाय उस कोड को स्वयं के संबंध में अच्छी तरह से बनाने पर ध्यान केंद्रित करता है।
एंट पी

जवाबों:


5

आप अपने लेनदेन को कैसे काटते हैं, यह वास्तव में व्यावसायिक तर्क है। तो अपने डीएओ परत के लिए एक डाटाबेस ढांचा स्वतंत्र एपीआई प्रदान करते हैं transactविधि आप का उल्लेख किया है (और बातों के लिए शायद की तरह commitऔर rollback)। फिर आप इसे अपने बीओ परत से अपने डेटाबेस या अपने डीबी ढांचे से निर्भर किए बिना उपयोग कर सकते हैं।


4

ऐसा लगता है कि ऑब्जेक्टिफ़ाइक परमाणु जैसे लेनदेन ( Google अनुप्रयोग इंजन लेनदेन ) के लिए डिज़ाइन किया गया है । यह आपसे लेनदेन प्रबंधन के अपने स्वयं के अमूर्त विकास की मांग करेगा ।

इस मामले में। अमूर्त पर चला जाता है कि मैं लेन-देन प्रबंधन को ऊपरी परतों में कैसे सौंपूँ?

@DocBrown दृष्टिकोण मुझे दिए गए आर्किटेक्चर ( स्तरित वास्तुकला ) को लागू करने के लिए तेज और क्लीनर समाधान दिखता है ।

एप्लिकेशन और उसके संदर्भ के बारे में बहुत सी जानकारी याद करने के कारण, Doc का समाधान मुझे सबसे सुरक्षित भी लगता है।

हालाँकि, मैं सुझाव दूंगा कि बिजनेस लेयर के लिए UnitOfWork डिज़ाइन पैटर्न पर एक नज़र डालें । मुझे लगता है कि यह Objectify द्वारा किए गए लेन-देन प्रबंधन के अनुरूप है ।

संक्षेप में संक्षेप में, पैटर्न का उद्देश्य व्यावसायिक लेनदेन (कार्य की इकाइयों) में व्यावसायिक नियमों को संक्षिप्त करना है । पैटर्न B.Ts के बीच विरासत की अनुमति देता है और अब तक मैं देखता हूं, ऑब्जेक्ट भी। यह रचना का भी समर्थन करता है। इसलिए या तो रचना या वंशानुक्रम द्वारा, दृष्टिकोण जटिल बीटी की अनुमति देता है ।

दिए गए आर्किटेक्चर पर लागू, ऐसा दिखेगा:

FileService -> FileBO : new EditFileTransaction().execute()
                           |-> ofy().transact(...)
                           |--> FileDAO.actionA()
                           |--> FolderDAO.actionA()
                           |-> [ofy().commit(...)|ofy().rollback()]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.