सबसे पहले, हमेशा योग मानों के माध्यम से समेकन के बीच संदर्भ होना चाहिए, वास्तविक वास्तविक संदर्भ नहीं?
वास्तव में नहीं - हालांकि कुछ प्रदर्शन कारणों से उस बदलाव को बदल देंगे।
उदाहरण के लिए अगर मैं एक आदेश के ग्राहक पर विवरण चाहते हैं मैं ग्राहक आईडी लेने के लिए और आदेश वस्तु की स्थापना एक ग्राहक सीधे सही वापस जाने के लिए तो बजाय एक ग्राहक पाने के लिए यह एक ICustomerRepository को पारित करने के लिए की आवश्यकता होगी?
आमतौर पर, आप रिश्ते (जैसे।, Customer.Orders
या Order.Customer
) ट्रेवर्सल के लिए 1 पक्ष मॉडल चाहते हैं। दूसरा उपयुक्त रिपोजिटरी (उदाहरण के लिए, CustomerRepository.GetCustomerFor(Order)
या OrderRepository.GetOrdersFor(Customer)
) से प्राप्त किया जा सकता है।
क्या इसका मतलब यह नहीं होगा कि ऑर्डर रिपॉजिटरी को ग्राहक बनाने के तरीके के बारे में कुछ जानना होगा? क्या OrderRepository जिम्मेदार होना चाहिए कि परे नहीं होगा के लिए ...
OrderRepository
एक ICustomerRepository.FindById(int)
उपयोग करने के लिए कैसे पता होगा। आप ICustomerRepository
इंजेक्ट कर सकते हैं। कुछ इसके साथ असहज हो सकते हैं, और इसे एक सेवा परत में रखना चुनते हैं - लेकिन मुझे लगता है कि यह अधिक है। कोई विशेष कारण नहीं है कि भंडार एक दूसरे के बारे में नहीं जानते और उपयोग नहीं कर सकते हैं।
मैं उलझन में हूं क्योंकि ग्राहक को वापस लौटने से लगता है कि यह मॉडल के खिलाफ लेखन कोड आसान बना देगा, और अगर मैं एनएचबीनेटनेट जैसे ओआरएम का उपयोग कर रहा हूं तो सेटअप करना बहुत मुश्किल नहीं है। फिर भी मैं काफी हद तक निश्चित हूं कि यह कुल जड़ों/भंडारों के बीच की सीमाओं का उल्लंघन करेगा।
सकल जड़ें अन्य कुल जड़ों के लिए संदर्भ धारण करने के लिए अनुमति दी जाती है। वास्तव में, किसी भी रूट के संदर्भ में कुछ भी रखने की अनुमति है। एक समग्र रूट एक गैर-कुल रूट इकाई का संदर्भ नहीं रख सकती है, जो इसके अंतर्गत नहीं है। ।
जैसे, Customer
OrderLines
के लिए एक संदर्भ पकड़ नहीं कर सकते हैं - के बाद से OrderLines
ठीक से Order
कुल जड़ पर एक इकाई के रूप अंतर्गत आता है।
दूसरा, दो समग्र जड़ों के लिए रिमोट रिलेशनशिप पर कैस्केड कहां और कैसे किया जाना चाहिए?
हैं (और मैं अगर तनाव है, क्योंकि यह एक अजीब आवश्यकता नहीं है) एक उपयोग मामला है कि वास्तव में, यह एक संकेत है कि Customer
अपने एकमात्र कुल जड़ होना चाहिए। सबसे वास्तविक दुनिया प्रणालियों में, तथापि, हम नहीं वास्तव में एक Customer
कि Order
रों संबंधित किया जाता है को नष्ट होगा - हम, उन्हें निष्क्रिय हो सकती हैं किसी मर्ज किए गए Customer
, आदि पर ले जाने के उनके Order
रों - लेकिन बाहर और बाहर नहीं Order
हटाना रों।
कहा जा रहा है, जबकि मैं इसे शुद्ध DDD है, सबसे लोगों का काम पैटर्न की एक इकाई आप Order
रों जहां हटा सकते हैं और उसके बाद निम्न में कुछ उदारता की अनुमति देगा नहीं लगता कि Customer
(अभी भी विफल हो जाएगा जो अगर Order
रों अस्तित्व में)। यदि आप चाहें तो CustomerRepository
काम भी कर सकते हैं (हालांकि मैं इसे और अधिक स्पष्ट करना चाहता हूं)। अनाथाश्रम Order
एस को बाद में साफ करने के लिए स्वीकार्य है (या नहीं)। उपयोग का मामला यहां सभी अंतर बनाता है।
मैं बजाय एक CustomerManagment सेवा है जो ग्राहकों को हटाने और उनके संबद्ध आदेश जायें जो कि दोनों रूप में उल्लेख एक IOrderRepository और ICustomerRepository संभालती है चाहिए? उस स्थिति में मैं कैसे सुनिश्चित कर सकता हूं कि लोग सेवा का उपयोग करना जानते हैं, न कि ग्राहकों को हटाने के लिए भंडार। क्या यह मॉडल को सही ढंग से उपयोग करने के तरीके पर शिक्षित करने के लिए बस नीचे है?
शायद मैं भंडार से इतनी गहराई से बंधे कुछ के लिए एक सेवा मार्ग नहीं जाऊंगा। यह सुनिश्चित करने के लिए कि एक सेवा का उपयोग कैसे किया जाता है ... आप CustomerRepository
पर सार्वजनिक Delete
नहीं डालते हैं। या, Customer
को हटाने पर Order
एस अनाथ छोड़ने पर आप एक त्रुटि फेंक देते हैं।
धन्यवाद! यह वास्तव में बहुत मदद करता है। हालांकि, एक रिश्ते का एक पक्ष मॉडल में जोड़ा गया है जैसा कि आप ऑर्डर के रूप में वर्णन करते हैं। ग्राहक संपत्ति। इसका मतलब यह नहीं होगा कि ऑर्डर रिपोजिटरी को ग्राहक बनाने के तरीके के बारे में कुछ जानना होगा? क्या ऑर्डर रिपोजिटरी के लिए ज़िम्मेदार नहीं होना चाहिए, और इस प्रकार "डेमेटर लॉ" (http://bit.ly/smi5M) को तोड़ना चाहिए। इस प्रश्न का उत्तर (http://bit.ly/iuVq2k) मूल रूप से मुझे लगता है कि आर्ग्रेगेट जड़ों के संदर्भ केवल आईडी के रूप में सहेजे गए हैं और संदर्भ संदर्भ नहीं हैं। –
मेरे पास ऊपर से पूछे गए एक से संबंधित प्रश्न है, मान लीजिए कि रिश्ते के एक तरफ मैं कुछ ग्राहक 'ऑर्डरर्स' जैसा करता हूं, अब आदेश आलसी लोड हो जाएगा, हालांकि निर्भरता के बारे में क्या है जो इस मामले में एक रिपोजिटरी ऑर्डर रिपोजिटरी लोड किया है? उदाहरण के लिए यदि ऑर्डर रिपोजिटरी प्रत्येक ऑर्डर एआर में इवेंटप्लिशर इंजेक्ट करेगी, तो यह इस परिदृश्य में मिस्ड हो जाएगा – Sudarshan
@ सुदर्शन - ग्राहक रिपोजिटरी ऑर्डर इकाई लोड करने के लिए ऑर्डर रेपॉजिटरी का उपयोग कर सकती है (और चाहिए)। इस तरह, आप कस्टमर रिपोजिटरी और ऑर्डर रिपोजिटरी के बीच तर्क को डुप्लिकेट नहीं कर रहे हैं। यदि ऑर्डर एक समग्र रूट भी है, तो ऑर्डर रिपॉजिटरी को सार्वजनिक रूप से सुलभ और FindOrdersByCustomerId विधि आंतरिक होना चाहिए। यदि यह कुल रूट नहीं है, तो इसे केवल ग्राहक पंजीकरण के लिए आंतरिक या निजी होना चाहिए - क्योंकि बाहरी ग्राहकों को गैर-समग्र इकाई का प्रत्यक्ष संदर्भ रखने की अनुमति नहीं है। –