लगभग सभी परिस्थितियों में, प्राथमिक कुंजी आपके व्यवसाय डोमेन का हिस्सा नहीं है। निश्चित रूप से, आपके पास अद्वितीय सूचकांकों ( UserName
उपयोगकर्ताओं के लिए या OrderNumber
आदेशों के लिए) के साथ कुछ महत्वपूर्ण उपयोगकर्ता-सामना करने वाली वस्तुएं हो सकती हैं, लेकिन ज्यादातर मामलों में, किसी भी मूल्य या मूल्यों के सेट द्वारा डोमेन ऑब्जेक्ट्स की पहचान करने के लिए कोई व्यवसाय करने की आवश्यकता नहीं है , लेकिन शायद एक प्रशासनिक उपयोगकर्ता। यहां तक कि उन असाधारण मामलों में, खासकर यदि आप वैश्विक अद्वितीय पहचानकर्ता (GUID) का उपयोग कर रहे हैं, तो आप प्राथमिक कुंजी को उजागर करने के बजाय एक वैकल्पिक कुंजी को नियुक्त करना चाहेंगे या करना चाहेंगे।
इसलिए, यदि डोमेन-संचालित डिज़ाइन की मेरी समझ सटीक है, तो प्राथमिक कुंजी की आवश्यकता नहीं है और इस प्रकार उजागर नहीं किया जाना चाहिए , और अच्छी रिडांस। वे बदसूरत हैं और मेरी शैली में ऐंठन करते हैं। लेकिन अगर हम डोमेन मॉडल में प्राथमिक कुंजियों को शामिल नहीं करना चुनते हैं, तो इसके परिणाम हैं:
- Naively, डेटा ट्रांसफर ऑब्जेक्ट्स (DTO) जो विशेष रूप से डोमेन मॉडल के संयोजन से प्राप्त होते हैं, में प्राथमिक कुंजी नहीं होगी
- आने वाले डीटीओ की प्राथमिक कुंजी नहीं होगी
तो, क्या यह कहना सुरक्षित है कि यदि आप वास्तव में शुद्ध रहने वाले हैं और अपने डोमेन मॉडल में प्राथमिक कुंजियों को खत्म कर रहे हैं, तो आपको उस प्राथमिक कुंजी पर अद्वितीय सूचकांकों के संदर्भ में हर अनुरोध को संभालने में सक्षम होने के लिए तैयार रहना चाहिए?
दूसरे तरीके से रखें, डोमेन मॉडल में पीके को हटाने के बाद निम्नलिखित में से कौन सा समाधान विशेष वस्तुओं की पहचान करने से निपटने का सही तरीका है?
- उन वस्तुओं की पहचान करने में सक्षम होने से जिन्हें आपको अन्य विशेषताओं से निपटने की आवश्यकता है
- डीटीओ में प्राथमिक कुंजी वापस प्राप्त करना; यानी, डोमेन से हठ से मैपिंग करते समय पीके को खत्म करना, फिर डोमेन से डीटीओ को मैप करते समय पीके को फिर से जोड़ना?
संपादित करें: चलो यह ठोस बनाते हैं।
कहो मेरे डोमेन मॉडल है VoIPProvider
जो जैसे क्षेत्रों में शामिल हैं Name
, Description
, URL
, संदर्भ की तरह है और साथ ही ProviderType
, PhysicalAddress
और Transactions
।
अब कहते हैं कि मैं एक वेब सेवा बनाना चाहता हूं जिससे विशेषाधिकार प्राप्त उपयोगकर्ता एस का प्रबंधन कर सकेंगे VoIPProvider
।
शायद इस मामले में एक उपयोगकर्ता के अनुकूल आईडी बेकार है; आखिरकार, वीओआईपी प्रदाता ऐसी कंपनियां हैं जिनके नाम कंप्यूटर के अर्थों में अलग-अलग हैं और व्यावसायिक कारणों से मानवीय अर्थों में भी पर्याप्त हैं। तो यह कहने के लिए पर्याप्त हो सकता है कि एक अद्वितीय VoIPProvider
पूरी तरह से निर्धारित होता है (Name, URL)
। तो अब हम कहते हैं कि मुझे एक विधि की आवश्यकता है PUT api/providers/voip
ताकि विशेषाधिकार प्राप्त उपयोगकर्ता VoIP
प्रदाताओं को अपडेट कर सकें । वे एक को भेजते हैं VoIPProviderDTO
, जिसमें बहुत सारे शामिल हैं, लेकिन सभी क्षेत्रों से नहीं VoIPProvider
, जिसमें कुछ समतल भी शामिल है। हालाँकि, मैं उनके दिमाग को नहीं पढ़ सकता, और उन्हें अभी भी मुझे यह बताने की ज़रूरत है कि हम किस प्रदाता के बारे में बात कर रहे हैं।
ऐसा लगता है कि मेरे पास 2 (शायद 3) विकल्प हैं:
- मेरे डोमेन मॉडल में एक प्राथमिक कुंजी या वैकल्पिक कुंजी शामिल करें और इसे डीटीओ को भेजें, और इसके विपरीत
- उस प्रदाता की पहचान करें जिसकी हम अद्वितीय सूचकांक के माध्यम से देखभाल करते हैं, जैसे
(Name, Url)
- किसी प्रकार की मध्यवर्ती वस्तु का परिचय दें जो हमेशा दृढ़ता परत, डोमेन और डीटीओ के बीच मैप कर सकती है, जो दृढ़ता परत के बारे में कार्यान्वयन के विवरण को उजागर नहीं करती है - डोमेन से डीटीओ और वापस जाने पर एक इन-मेमोरी अस्थायी पहचानकर्ता को शुरू करने से कहें।