एक डीएओ कैसे जटिल अपने व्यापार मॉडल के आधार पर डेटा का एक संबंधित स्रोत के लिए पहुँच प्रदान करना चाहिए और, या तो संपूर्ण व्यापार वस्तुओं, या सरल डाटा वस्तुओं वापस आ जाएगी। किसी भी तरह से, डीएओ विधियों को कुछ हद तक डेटाबेस को प्रतिबिंबित करना चाहिए।
एक सेवा न केवल आपके व्यावसायिक वस्तुओं को संसाधित करने के लिए एक उच्च स्तरीय इंटरफ़ेस प्रदान कर सकती है, बल्कि पहले स्थान पर पहुंच प्राप्त करने के लिए। अगर मुझे किसी सेवा से व्यवसाय ऑब्जेक्ट मिलता है, तो वह ऑब्जेक्ट अलग-अलग डेटाबेस (और विभिन्न डीएओ) से बनाया जा सकता है, इसे HTTP अनुरोध से की गई जानकारी से सजाया जा सकता है। इसमें कुछ व्यावसायिक तर्क हो सकते हैं जो कई डेटा ऑब्जेक्ट्स को एकल, मजबूत, व्यावसायिक ऑब्जेक्ट में परिवर्तित करता है।
मैं आम तौर पर एक डीएओ सोचता हूं कि इसका उपयोग किसी भी डेटाबेस द्वारा किया जाएगा, जो उस डेटाबेस का उपयोग करने जा रहा है, या व्यापार से संबंधित डेटा सेट है, यह सचमुच डेटाबेस के भीतर ट्रिगर्स, फ़ंक्शंस और संग्रहीत प्रक्रियाओं के अलावा निम्नतम स्तर कोड है।
विशिष्ट प्रश्नों के उत्तर:
मैं सोच रहा था कि क्या एक डीएओ तरीकों कि वास्तव में नहीं है डेटा का उपयोग के साथ ज्यादा करने के लिए हो सकता है, लेकिन जिस तरह से एक क्वेरी का उपयोग आसान मार डाला ?
ज्यादातर मामलों के लिए, आप अपनी सेवा परत में अधिक जटिल व्यापार तर्क, अलग-अलग प्रश्नों से डेटा की असेंबली चाहते हैं। हालांकि, यदि आप प्रसंस्करण गति के बारे में चिंतित हैं, तो एक सेवा परत एक डीएओ को एक क्रिया का प्रतिनिधि दे सकती है, भले ही यह मॉडल की सुंदरता को तोड़ देती है, वैसे ही एक सी ++ प्रोग्रामर कुछ क्रियाओं को गति देने के लिए असेंबलर कोड लिख सकता है।
यह एक सेवा परत विधि का अधिक होना मेरे लिए लगता है, लेकिन अगर सेवा परत में जेपीए EntityManager का उपयोग कर अच्छा अभ्यास का एक उदाहरण है मुझे यकीन है कि नहीं कर रहा हूँ?
आप अपनी सेवा में अपनी इकाई प्रबंधक का उपयोग करने जा रहे हैं, तो अपने डीएओ रूप में संस्था प्रबंधक के बारे में सोच है, क्योंकि यह है कि यह वास्तव में क्या है। यदि आपको कुछ अनावश्यक क्वेरी बिल्डिंग को हटाने की आवश्यकता है, तो अपनी सेवा कक्षा में ऐसा न करें, इसे उस वर्ग में निकालें जो इकाई प्रबंधक का उपयोग करता है और इसे आपके डीएओ बनाता है। आपके उपयोग के मामले बहुत आसान है, तो आप सेवा परत पूरी तरह छोड़ सकते हैं और नियंत्रकों में आपके इकाई प्रबंधक, या डीएओ इस्तेमाल कर सकते हैं, क्योंकि सभी आपकी सेवा करने जा रहा है डीएओ के findAirplaneById()
अद्यतन करने के लिए getAirplaneById()
के लिए कॉल पास है - करने के लिए नीचे दी गई चर्चा के संबंध में स्पष्ट करें, किसी सेवा में किसी इकाई प्रबंधक का उपयोग करने की संभावना अधिकांश स्थितियों में सबसे अच्छा निर्णय नहीं है, जहां टिप्पणियों में हाइलाइट किए गए विभिन्न कारणों के लिए डीएओ परत भी होती है। लेकिन मेरी राय में यह पूरी तरह उचित दी जाएगी:
- सेवा डेटा के विभिन्न सेट के साथ बातचीत करने की जरूरत है
- कम से कम एक डेटा का सेट पहले से ही एक डीएओ
- सेवा वर्ग एक मॉड्यूल में रहता है जिसके लिए कुछ दृढ़ता की आवश्यकता होती है जो कि अपने स्वयं के डीएओ
उदाहरण के लिए पर्याप्त नहीं है।
//some system that contains all our customers information
class PersonDao {
findPersonBySSN(long ssn)
}
//some other system where we store pets
class PetDao {
findPetsByAreaCode()
findCatByFullName()
}
//some web portal your building has this service
class OurPortalPetLostAndFoundService {
notifyOfLocalLostPets(Person p) {
Location l = ourPortalEntityManager.findSingle(PortalUser.class, p.getSSN())
.getOptions().getLocation();
... use other DAO's to get contact information and pets...
}
}
इस तरह के विस्तृत उत्तर के लिए धन्यवाद। मुझे आश्चर्य है: क्या दोनों के पास डीएओ का संग्रह होना चाहिए और सेवा परत में EntityManager का उपयोग करना ठीक होगा? –
मुझे नहीं लगता कि इसमें कुछ भी गलत है, ध्यान रखें कि बोहोजो ने सेवा परत के बारे में क्या कहा था, जो कि अज्ञेयवादी थे। अगर चीजें तुच्छ से कम हो जाती हैं, तो मेरे पास सिर्फ एक ही डीएओ होगा जो इकाई प्रबंधक का उपयोग करता है और सभी इकाइयों के साथ सौदों का उपयोग करता है। मुझे कभी भी सामान्य पैटर्न के लिए कोई उपयोग नहीं मिला है जहां एक डीएओ किसी इकाई या टेबल के लिए विशिष्ट है, मुझे लगता है कि कक्षा डीएओ को डेटाबेस के लिए बाध्य होना चाहिए, अगर वर्ग बड़ा हो जाता है, तो यह स्पष्ट होता है कि यह अनावश्यक है कि – walnutmon
ठीक है। मैंने ज्यादातर डीएओ को देखा है जो कसकर एक इकाई/टेबल के साथ मिलकर थे और सोचा था कि uncoupling अच्छा अभ्यास का उल्लंघन होगा। तो क्यूवर्की के जवाब में विधि AAOOperatingFrom() प्राप्त करें ठीक है? –