2010-12-16 15 views
10

विचार करें कि मेरे पास नियंत्रक विधि प्राप्त है() जो डेटाबेस के साथ काम करने वाली कुछ सेवा विधियों को कॉल करती है।लेनदेन: नियंत्रक बनाम सेवा

क्या संपूर्ण नियंत्रक विधि लेनदेन या सिर्फ हर सेवा विधि को सही बनाने के लिए सही है?

ऐसा लगता है कि हमें() लेनदेन करना होगा क्योंकि यह संबंधित संचालन करता है।

धन्यवाद!

उत्तर

5

मैं केवल उन प्रक्रियाओं को लेन-देन करना पसंद करता हूं जिन्हें लेन-देन की आवश्यकता होती है और सेवा में लेनदेन की स्थिति को नियंत्रित नहीं किया जाता है। आप एक सेवा विधि बना सकते हैं जो अन्य सेवा विधियों को englobes और वसंत लेनदेन के साथ लेनदेन का प्रबंधन @Transactional एनोटेशन में प्रचार के साथ।

@Transactional(propagation =...) 

संपादित

अगर मैं उदाहरण saveUser() और saveEmail() (क्योंकि मैं एक डेटाबेस में ईमेल की दुकान से उन्हें बाद में भेजने के लिए - एक कतार की तरह) के लिए 2 तरीकों था मैं में पैदा करेगा मेरी सेवा एक विधि saveUserAndSendEmail (उपयोगकर्ता उपयोगकर्ता) जो लेनदेन होगी। यह विधि saveUser और saveEmail() को प्रत्येक को @Repository घटक में कॉल करेगी क्योंकि वे डेटाबेस से निपटती हैं। तो मैं उन्हें डेटाबेस के साथ संभालने के तरीकों @ रिपोजिटरी घटकों में रखूंगा और फिर मैं @Service घटक में लेनदेन को नियंत्रित करता हूं। फिर नियंत्रक को केवल डेटा प्रदान करने और जब भी आवश्यकता हो, कॉल करने के बारे में चिंता करनी होगी। लेकिन मैं एक लेनदेन करता हूं क्योंकि मैं डेटाबेस में बदलाव नहीं करना चाहता जब तक कि पूरी विधि सफलतापूर्वक निष्पादित न हो जाए।

लेकिन यह वह शैली है जिसका मैं आमतौर पर उपयोग करता हूं, मैं यह नहीं कह रहा हूं कि यह जाने का रास्ता होना चाहिए।

+0

ऐसा लगता है कि यह पसंदीदा डिजाइन है लेकिन क्यों? मुझे लगता है कि मुझे लोड करने की आवश्यकता है IenuItems(), loadUserInfo(), loadDocument() - कई विधियां। आपके अनुसार मुझे एक लोडमेनूइटम और यूज़र इंफो और डॉक्यूमेंट() विधि बनाना है - क्या यह ठीक है? –

+0

@ एंड्रे मैंने नहीं कहा है कि यह पसंदीदा डिजाइन है। जिस तरह से मैं आमतौर पर काम करता हूं क्योंकि मैं पसंद करता हूं कि नियंत्रक को लेनदेन प्रबंधन से अवगत होने की आवश्यकता नहीं है। लोड के साथ शुरू होने वाली विधियों के नाम के अनुसार ... यदि वे केवल डेटाबेस से वास्तविक हैं तो आपको लेनदेन करने की आवश्यकता क्यों है? – Javi

+1

ठीक है, अगर आपके पास दो विधियां हैं: createUser(), sendEmail() विभिन्न सेवाओं (उपयोगकर्ता और मेल) से। और आपको उन्हें एक लेनदेन नियंत्रक में कॉल करने की आवश्यकता है। आपको क्या करना चाहिये? –

7

यह पूरी तरह से आपके ऊपर है, और आप अपने व्यवसाय तर्क की व्याख्या कैसे करते हैं।

वसंत वास्तव में परवाह नहीं करता है कि आप लेनदेन की सीमाएं कहां रखते हैं, और निश्चित रूप से आपको अपने डीएओ कक्षाओं में रखने के लिए सीमित नहीं करता है।

तो हां, आपके नियंत्रक विधियों में @Transactional जोड़ना पूरी तरह से मान्य है।

+6

IMHO, @ नियंत्रक में ट्रांसेक्शनल को आर्किटेक्चरल परिप्रेक्ष्य (एमवीसी) से बहुत अधिक समझ नहीं है। मेरा मतलब है, एक नियंत्रक को दृढ़ता परत के बारे में पता नहीं होना चाहिए, और आपको अपने व्यावसायिक तर्क को डेस्कटॉप एप्लिकेशन में पुन: उपयोग करना पड़ सकता है जहां आपकी नियंत्रक परत मौजूद नहीं है ... मुझे लगता है कि लेनदेन को @Service परत में परिभाषित किया जाना चाहिए। –

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