2011-08-25 23 views
6

के अंदर एक इकाई को अपडेट करें मैं SO: How update an entity inside Aggregate पर एक समान प्रश्न पढ़ रहा था, लेकिन मुझे अभी भी यह सुनिश्चित नहीं है कि उपयोगकर्ता इंटरफ़ेस को कुल मिलाकर इकाइयों के साथ कैसे इंटरैक्ट करना चाहिए।कुल

मान लें कि मेरे पास User है, Address es के समूह के साथ। उपयोगकर्ता कुल रूट है, जबकि पता केवल कुल के भीतर मौजूद है।

वेब इंटीफेस पर, कोई उपयोगकर्ता अपने पते को संपादित कर सकता है। असल में, क्या होता है:

  • उपयोगकर्ता अपने वेब इंटरफेस
  • वह एक पते पर क्लिक करता है, और इस पृष्ठ पर रीडायरेक्ट हो जाता है पर पतों की सूची देखता है: edit-address?user=1&address=2
  • इस पृष्ठ पर, वह हो जाता है एक वह फॉर्म जहां वह इस पते को संशोधित कर सकता है।

मैं हम इस सरल होगा कुल जड़ बायपास करने के लिए फैसला किया:

  • हम सीधे के साथ Address लोड होगा अपने Id
  • हम इसे अद्यतन होगा, तो बचाने के यह

क्योंकि हम इसे डीडीडी तरीके से करना चाहते हैं, हमारे पास अलग-अलग समाधान हैं:

  1. या तो हम उपयोगकर्ता पूछना आईडी द्वारा इस पता पाने के लिए :

    address = user.getAddress(id);
    address.setPostCode("12345");
    address.setCity("New York");
    em.persist(user);

    इस दृष्टिकोण के साथ समस्या यह है, IMO, कि कुल जड़ अभी भी पते के साथ क्या किया गया है पर अधिक नियंत्रण नहीं है। यह सिर्फ इसका संदर्भ देता है, इसलिए यह कुल को छोड़कर बहुत अलग नहीं है।

  2. या हम किसी मौजूदा पते अद्यतन करने के लिए कुल बता :

    user.updateAddress(id, "12345", "New York");
    em.persist(user);

    अब कुल है क्या इस पते के साथ किया है, और है कि चला जाता है कोई भी आवश्यक कार्रवाई कर सकते हैं पर नियंत्रण एक पता अद्यतन करने के साथ।

  3. या हम एक मूल्य वस्तु के रूप में पता का इलाज, और हम अपने Address अपडेट करते हैं, बल्कि इसे हटा और यह पुन:

    user.removeAddress(id);
    address = new Address();
    address.setPostCode("12345");
    address.setCity("New York");
    user.addAddress(address);
    em.persist(user);

    यह अंतिम समाधान सुरुचिपूर्ण लग रहा है, लेकिन इसका मतलब है कि एक पता एक संस्था नहीं हो सकता है। फिर, अगर को इकाई के रूप में माना जाता है, तो उदाहरण के लिए, क्योंकि कुल मिलाकर किसी अन्य व्यावसायिक वस्तु का संदर्भ है?

मैं बहुत यकीन है कि मैं यहाँ कुछ याद कर रहा हूँ सही ढंग से कुल अवधारणा को समझने की और कैसे यह वास्तविक जीवन उदाहरण में प्रयोग किया जाता है, ताकि अपनी टिप्पणी देने के लिए संकोच नहीं करते कृपया रहा हूँ!

उत्तर

4

नहीं, आप कुछ भी याद आ रही नहीं कर रहे हैं - (- अद्यतन लगता है ऐसा नहीं-DDD हालांकि मुझे लगता है कि विधि कॉल था changeAddress तो updateAdress) और कहा कि एक पते पर कि क्या परवाह किए बिना है ज्यादातर मामलों में सबसे अच्छा विकल्प नंबर 2 होगा एक इकाई या मूल्य वस्तु है। सर्वव्यापी भाषा आप कहेंगे कि उपयोगकर्ता ने अपना पता बदल दिया है, तो यह ठीक है कि आपको इसे कैसे मॉडल करना चाहिए - यह changeAddress विधि है जो यह तय करती है कि अद्यतन गुण (यदि पता एक इकाई है) या पूरी तरह से नई वस्तु असाइन करें (कब यह वीओ है)।

public void ChangeAddress(AddressParams addressParams) 
    { 
     // here we might include some validation 

     address = new Address(addressParams); 

     // here we might include additional actions related with changing address 
     // for example marking user as required to confirm address before 
     // next billing 
    } 

क्या इस नमूने में महत्वपूर्ण है, कि एक बार पता बनाई गई है, यह वैध माना जाता है है - कोई अमान्य पता नहीं हो सकता: VO के रूप में पता -

निम्न नमूना कोड मान लिया गया है सबसे आम स्थिति में अपने कुल में वस्तु। हालांकि, ध्यान रखें कि आपको इस नमूना का पालन करना चाहिए या नहीं, आपके वास्तविक डोमेन पर निर्भर करता है - अनुसरण करने के लिए कोई भी रास्ता नहीं है। यद्यपि यह सबसे आम है।

और हां, आपको हमेशा अपनी संस्थाओं पर कुल रूट के माध्यम से ट्रैवर्स करके संचालन करना चाहिए - इसका कारण SO पर कई उत्तरों में दिया गया था (उदाहरण के लिए इस Basic Aggregate Question में)।

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

एक और उदाहरण - अधिकांश डोमेन के लिए Money एक वैल्यू ऑब्जेक्ट होगा - 10 $ 10 $ है, इसकी राशि के अलावा कोई पहचान नहीं है। हालांकि यदि आप ऐसे डोमेन का मॉडल करेंगे जो बिलों के स्तर पर पैसे से संबंधित है, तो प्रत्येक बिल की अपनी पहचान होगी (किसी प्रकार की अनूठी संख्या के साथ व्यक्त की जाएगी) इस प्रकार यह एक इकाई होगी।

+0

धन्यवाद। यह वास्तव में समझ में आता है, हालांकि मुझे यकीन नहीं है कि 'changeAddress()' विधि को कैसे कार्यान्वित किया जाए। उपर्युक्त उदाहरण एक oversimplification है, और एक पता सड़क के नाम, इमारत संख्या, मानचित्र पर सही स्थान के लिए 'LatLng' बिंदु सहित एक दर्जन क्षेत्रों से बना हो सकता है।फिर आप क्या सुझाव देते हैं, इन सभी मानकों को विधि तर्कों में रखें, या फ़ॉर्म से किसी प्रकार की क्षणिक वस्तु बनाएं (क्या यह 'पता' ऑब्जेक्ट भी होगा?), और इसे इस विधि के लिए तर्क के रूप में पास करें? – Benjamin

+0

मैंने सबसे आम परिदृश्य के लिए नमूना कोड जोड़ा है। मैं खेतों की संख्या के बारे में चिंता नहीं करता - डीडीडी वास्तव में डेटा के बारे में नहीं है, यह संबंधों और जटिलता के प्रबंधन के बारे में है। – kstaruch

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