2009-07-14 9 views
5

फ्रेमवर्क डिजाइन दिशानिर्देश से:इकाइयों (डीडीडी में) के लिए ऑब्जेक्ट। एक्वाल्स ओवरराइड करना चाहिए?

परिवर्तनशील संदर्भ प्रकार पर मूल्य समानता नहीं लागू करते हैं। [पी 270]

एरिक इवांस के DDD से:

प्रत्येक इकाई किसी अन्य वस्तु के साथ अपनी पहचान स्थापित करने की एक संचालन तरह से होना चाहिए। [पी 94]

मैं पहचान आपरेशन के रूप में Object.Equals विधि अधिभावी व्यवहार करना चाहिए या सिर्फ पहचान विशेषता तुलना (जैसे customer1.Id == customer2.Id)?

उत्तर

7

ऐसे तीन मामले हैं जिन्हें आप अलग करने में सक्षम होना चाहते हैं।

  1. आपके पास एक ही इकाई के दो संदर्भ हैं। इस मामले में सामान्य समानता ऑपरेटर अपनी नौकरी सही तरीके से करेंगे। कुछ भी ओवरराइड करने की जरूरत नहीं है।

  2. आपके पास एक ही इकाई की स्मृति में दो उदाहरण हैं। जब आप अपने भंडारों को सही तरीके से डिजाइन करते हैं तो यह स्थिति टालने योग्य है लेकिन कभी-कभी यह एक ऐसी स्थिति है जिसके साथ आपको काम करना होगा। आपका ग्राहक 1.आईडी == ग्राहक 2.आईडी उदाहरण इस मामले में ठीक काम करेगा।

  3. आपके पास दो अलग-अलग संस्थाएं हैं लेकिन आप जानना चाहते हैं कि उनके पास समान संपत्ति मूल्य है या नहीं। यह एक कोड-गंध हो सकता है। आप एक मान प्रकार के रूप में एक इकाई के रूप में इलाज कर रहे हैं। यदि यह वास्तव में ऐसा कुछ है जिसे आप करना चाहते हैं तो आपको इसे सामान्य .net == और अलग-अलग तंत्र से अलग से कार्यान्वित करना चाहिए। (उदाहरण के लिए IsSameAs (ग्राहक विषय)) भ्रम से बचने के लिए।

+0

"जब आप अपने भंडार सही तरीके से डिजाइन करते हैं" का क्या मतलब है? स्मृति में एक से अधिक उदाहरणों की समस्या से आप कैसे बचते हैं? – dthrasher

+0

आप भंडारों को लोड ऑब्जेक्ट्स और उनकी आईडी के संदर्भों का शब्दकोश शब्दकोश रख सकते हैं। जब भी किसी ऑब्जेक्ट की आवश्यकता होती है तो बस एक ही ऑब्जेक्ट का संदर्भ लौटाएं। अधिकांश ओआरएम आपके लिए यह करते हैं – Mendelt

0

मामले में आप अधिभावी Object.Equals आप मन तुम भी है कि GetHashCode ओवरराइड करने के लिए() में रखने के लिए विचार करें।

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

  • कोई संबंधित समस्या नहीं^_^