2009-12-29 9 views
12

पेशेवरों की विपक्ष:पेशेवरों और DDD डेटा संग्रह स्थान

  • डेटा संग्रह स्थान जटिल प्रश्न छिपाना।
  • रिपोजिटरी विधियों का उपयोग लेनदेन सीमाओं के रूप में किया जा सकता है।

    • ORM चौखटे की पेशकश पहले से ही एक संग्रह लगातार वस्तुओं के लिए इंटरफ़ेस की तरह, खजाने के इरादे क्या है:
    • ORM आसानी से

    विपक्ष मज़ाक उड़ाया जा सकता है। तो भंडार प्रणाली में अतिरिक्त जटिलता जोड़ते हैं।

  • findBy विधियों का उपयोग करते समय संयोजक विस्फोट। इन विधियों को मानदंड वस्तुओं, प्रश्नों या उदाहरण वस्तुओं से बचा जा सकता है। लेकिन ऐसा करने के लिए कोई भंडार की आवश्यकता नहीं है क्योंकि एक ओआरएम वस्तुओं को खोजने के लिए पहले से ही इन तरीकों का समर्थन करता है।
  • चूंकि भंडार कुल जड़ें (डीडीडी के अर्थ में) का संग्रह होते हैं, इसलिए केवल एक बच्चे की वस्तु को संशोधित करने के बावजूद कुल जड़ें बनाना और पास करना होता है।

सवाल:

  • आप क्या पक्ष और विपक्ष में पता है?
  • क्या आप रिपॉजिटरीज का उपयोग करने की सलाह देंगे? (क्यों या क्यों नहीं?)
+2

रिपॉजिटरीज़ के साथ तुलनात्मक ओआरएम वास्तव में समझ में नहीं आता है - आप रिपॉजिटरीज को लागू करने के लिए ओआरएम का उपयोग करते हैं, नहीं? –

+1

कोई निश्चित उत्तर नहीं। सामुदायिक विकी? –

+1

आपका तीसरा कॉन समझ में नहीं आता है। यदि आपको अपने "बाल वस्तु" को अपने आप में हेरफेर करने की आवश्यकता है, तो यह एक समग्र रूट होना चाहिए। –

उत्तर

8

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

जब आप ओआरएम का उपयोग कर रहे हों तो आपको अपने एपीआई को यथासंभव सीमित तरीके से उपयोग करना चाहिए, जो स्वयं को एक विशिष्ट रूप से एक मुखौटा दे रहा है जो डोमेन विशिष्ट है। तो भले ही आपका डोमेन अभी भी एक भंडार देखेंगे। तथ्य यह है कि दूसरी ओर एक ओआरएम एक "कार्यान्वयन विस्तार" है।

7

एक भंडार वास्तव में एक इंटरफेस की तरह अबास्ट्रक्शन की एक परत है। जब आप अपने डेटा दृढ़ता कार्यान्वयन (यानी आपका डेटाबेस) decouple करना चाहते हैं तो आप इसका उपयोग करते हैं।

मुझे लगता है कि यदि आप अपने डीएएल को रद्द करना नहीं चाहते हैं, तो आपको एक भंडार की आवश्यकता नहीं है। लेकिन ऐसा करने के कई फायदे हैं, जैसे टेस्टेबिलिटी।

"ढूंढें" विधियों के संयोजन विस्फोट के संबंध में: .NET में आप एक आईनेमरेबल के बजाय एक IQueryable वापस कर सकते हैं, और कॉलिंग क्लाइंट को एक ढूँढें विधि का उपयोग करने के बजाय उस पर एक लिंक क्वेरी चलाने की अनुमति दें। यह ग्राहक के लिए लचीलापन प्रदान करता है, लेकिन एक अच्छी तरह से परिभाषित, टेस्टेबल इंटरफ़ेस प्रदान करने की क्षमता को त्याग देता है। अनिवार्य रूप से, आप दूसरे के लिए लाभ के एक सेट का व्यापार करते हैं।

+1

+1 आईपॉजिटरी से IQueryable लौटने पर +1। यह आपको सेवा/रूट परत में अपना "ढूंढें" तर्क लिखने की अनुमति देता है, और एक आईरिपोजिटरी का मज़ाक उड़ाकर उस तर्क का परीक्षण करता है। परीक्षण के लिए, "रिपोजिटरी" परत है जहां मैं यूनिट परीक्षण और एकीकरण परीक्षण के बीच रेखा खींचता हूं - मैं अपने रेपोज़ के लिए एकीकरण परीक्षण लिखता हूं और वे एक IQueryable के लिए उचित FetchAll() रिकॉर्ड्स वापस लौटाते हैं, और यूनिट परीक्षणों को और कुछ और करने के लिए इसमें वास्तविक व्यापार तर्क है। – eduncan911

+0

कम से कम NHibernate के साथ आपको यह पता होना चाहिए कि linq को कॉल करने के बीच बड़े अंतर (कैशिंग, मार्ग क्वेरी निष्पादित की गई हैं)। जहां (a => a.id == id) और ISession को कॉल करना। लोड (आईडी)। डेटा तक पहुंचने के लिए एक IQueryable तरीका होना उपयोगी हो सकता है, लेकिन इसके साथ सबकुछ करने की कोशिश न करें, ध्यान रखें कि ओआरएम आमतौर पर उन्नत प्रश्नों और संचालन करने के कुछ तरीकों की पेशकश करता है। –

8

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

यह भंडार आदेश संसाधन आवेदन में दिखाई दे सकता है कि कैसे:

List<Order> myOrders = Orders.FindPending() 

नोट 'मानदंड' या 'क्वेरी' की तरह कोई डेटा का उपयोग मामले देखते हैं कि। आंतरिक रूप से 'फाइंडपेन्डिंग' विधि को हाइबरनेट मानदंड या एचक्यूएल का उपयोग करके कार्यान्वित किया जा सकता है लेकिन इसका डीडीडी से कोई लेना देना नहीं है।

विधि विस्फोट एक वैध चिंता है। उदाहरण के लिए आप कई विधियों के साथ समाप्त हो सकते हैं जैसे:

Orders.FindPending() 
    Orders.FindPendingByDate(DateTime from, DateTime to) 
    Orders.FindPendingByAmount(Money amount) 
    Orders.FindShipped() 
    Orders.FindShippedOn(DateTime shippedDate) 
    etc 

यह विशिष्टता पैटर्न का उपयोग करके सुधार किया जा सकता है। उदाहरण के लिए आप ताकि भंडार इस तरह दिखेगा एक वर्ग

class PendingOrderSpecification{ 
    PendingOrderSpecification WithAmount(Money amount); 
    PendingOrderSpecification WithDate(DateTime from, DateTime to) 
    ... 
} 

हो सकता है:

Orders.FindSatisfying(PendingOrderSpecification pendingSpec) 
Orders.FindSatisfying(ShippedOrderSpecification shippedSpec) 

एक अन्य विकल्प विचाराधीन और शिप किए गए आदेश के लिए अलग भंडार है।

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