2011-05-01 20 views
5

मैं Zend फ्रेमवर्क और एकीकृत कर रहा सिद्धांत 2, और मैं सेवा परत की खोज कर रहा हूँ।जेडएफ + सिद्धांत 2: भारी मॉडल कक्षाएं या हल्के मॉडल + सेवा परत?

अब मैं समझता हूँ (मैं गलत कर रहा हूँ?) मैं 2 आर्किटेक्चर संभव है:

  • एक मॉडल, जहां कक्षाएं डोमेन तर्क होते हैं, यानी गुण + getters/setters + जटिल तरीकों
  • एक हल्के मॉडल, जहां कक्षाएं गुण + getters/setters और एक सेवा परत, डोमेन तर्क युक्त, और संशोधित मॉडल वर्गों
शामिल

प्रत्येक के पेशेवर/विपक्ष क्या हैं?

ऐसा लगता है कि मॉडल तर्क के बाहर डोमेन तर्क डालकर ओओपी खोना मुझे अजीब लगता है, इसलिए मुझे समझ में नहीं आता कि सेवा परत का उपयोग क्यों करें।

+0

हमेशा 2 और आर्किटेक्चर संभव हैं – Fatmuemoo

उत्तर

14

आपको क्या लगता है कि आपकी सेवा परत बाहरी आपके मॉडल पर है? यह नहीं है वास्तव में, यह आपके मॉडल का एक केंद्रीय हिस्सा है, साथ ही संस्थाओं, भंडारों आदि के साथ

यदि आप Doctine2 का उपयोग कर रहे हैं, तो आप एक सेवा परत चाहते हैं। एक कारण यह है कि आप नहीं चाहते हैं कि आपकी संस्थाएं EntityManager (टेस्टेबिलिटी को नुकसान पहुंचाती हैं) के बारे में जानना चाहें। दूसरा यह है कि आप यह भी नहीं चाहते कि आपके नियंत्रक ईएम चला रहे हों (यह दृढ़ता के बारे में जानने के लिए नियंत्रक नौकरी नहीं है)।

मैं आमतौर पर एक आर्किटेक्चर का उपयोग करता हूं जहां सेवा परत मॉडल के नियंत्रक का इंटरफेस है। सेवा परत उन कार्यों को उजागर करती है जो संस्थाओं पर काम करती हैं (या तो उन्हें पैरामीटर के रूप में ले रही हैं, या उन्हें वापस कर रही हैं, या दोनों)। इकाइयों की दृढ़ता सेवा परत से छिपी हुई है। या तो सेवा वर्ग ईएम और रिपोजिटरी को स्वयं चलाता है, या इसे किसी अन्य कोड पर प्रतिनिधि करता है जिसे नियंत्रक कभी नहीं जानता है।

तो सेवा परत प्रदान करता है और एपीआई जो नियंत्रक आपके व्यावसायिक डेटा में हेरफेर करने के लिए उपयोग कर सकते हैं।

+0

ग्रेट और स्पष्ट उत्तर धन्यवाद, हालांकि मुझे ओओपी खोने का अर्थ समझने में परेशानी है ... मेरा मतलब है कि मुझे लगता है कि '$ user-> generPassword() 'बेहतर * है '$ userService-> जेनरपैसवर्ड ($ उपयोगकर्ता) 'क्योंकि विधि उपयोगकर्ता पर लागू होती है, यह एक पैरामीटर पर लागू" फ़ंक्शन "नहीं है ... यही मेरा मतलब है" बाहरी "। मेरे लिए यह ओओपी (ऑब्जेक्ट्स पर ऑब्जेक्ट्स और विधियों) और फंक्शन प्रोग्रामिंग के बीच के अंतर के समान है। सेवा परत के साथ, ऑब्जेक्ट केवल एक डेटा कंटेनर है ... –

+0

@matthieu अगर आपका 'जेनरेट पासवर्ड()' विधि केवल यादृच्छिक स्ट्रिंग उत्पन्न करता है तो यह आपके सिस्टम में उस विधि को ठीक करना ठीक है; यह किसी बाहरी, दृढ़ता से संबंधित निर्भरताओं को उत्पन्न नहीं करता है। – Cobby

+1

@matthieu - इकाई का * डेटा-कंटेनर हैं - वे केवल "फैंसी" हैं (क्योंकि उनके पास आंतरिक स्थिति में हेरफेर या रिपोर्ट करने के तरीके हो सकते हैं)। जेनरपैसवर्ड() ठीक हो सकता है - जब तक यह किसी बाहरी चीज़ पर भरोसा नहीं करता है। उदाहरण के लिए, यदि जेनरपैसवर्ड() केवल 8 यादृच्छिक वर्ण उत्पन्न करता है, और उस स्ट्रिंग को $-- पासवर्ड (या इसे $-- setPassword() में पास करता है जो उसके बाद उचित है), यह ठीक है। यह ठीक है क्योंकि यह केवल उपयोगकर्ता के पासवर्ड को प्रभावित करता है, और कुछ भी नहीं। अब, यदि आप उपयोगकर्ता को अपना नया पासवर्ड ईमेल करना चाहते हैं, तो आप – timdev