2010-11-22 14 views
7

मैं अपने आवेदन में इस परिदृश्य है:MVC - एक और मॉडल से एक मॉडल का संदर्भ

  • Controller1

    • .GetItems()
  • MODEL1

    • .GetItems()
  • Controller2

    • .GetCurrentUser()
  • MODEL2

    • .CurrentUser

इस परिदृश्य में नियंत्रक 1.GetItems() मॉडल 1.GetItems() विधि को कॉल करता है। Model1.GetItems() विधि को जानने की आवश्यकता है (उदाहरण के लिए) आइटम की सही सूची बनाने के लिए वर्तमान उपयोगकर्ता की भूमिका क्या है, और इसे इसे Model2.CurrentUser प्रॉपर्टी से प्राप्त करना चाहिए (जो वर्तमान उपयोगकर्ता के बारे में कैश की गई जानकारी संग्रहीत करता है)।

क्या यह किसी अन्य मॉडल से मॉडल को acces करने का एक अच्छा अभ्यास है?

धन्यवाद, सादर

उत्तर

3

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

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


डिजाइन - नियंत्रक प्रदान करता है डाटा

ModelOne

  • उपयोगकर्ता GetCurrentUser()

ModelTwo

  • आइटम [] GetItems (उपयोगकर्ता)

स्निपेट - नियंत्रक Proivdes डाटा

Controller { 
    function doWork() { 
    User user = ModelOne.GetCurrentUser(); 
    Items[] items = ModelTwo.GetItems(user); 
    } 
} 

डिजाइन - मॉडल डाटा

मो हो जाता है Delone

  • उपयोगकर्ता GetCurrentUser()

ModelTwo

  • आइटम [] GetItems()

स्निपेट - मॉडल हो जाता है डाटा

ModelTwo { 
    Items[] GetItems() { 
    User user = ModelOne.GetCurrentUser(); 

    ... 

    } 
} 

Controller { 
    function doWork() { 
    Items[] items = ModelTwo.GetItems(); 
    } 
} 
+0

धन्यवाद। इसलिए मैं पसंद करता हूं कि मॉडल को दूसरे मॉडल से डेटा प्राप्त हो। कारण यह है: स्टैक ओवरफ्लो पर प्रश्न पोस्ट करने से मैंने परिदृश्य को सरल बना दिया। वास्तविक परिदृश्य में मॉडल को अन्य मॉडलों (उदाहरण के लिए एक और मॉडल जो मौजूदा उपयोगकर्ता वफादारी स्तर के बारे में जानकारी का मालिक है) से अन्य जानकारी की आवश्यकता हो सकती है। तो मैं Model1.GetItems() में तर्क को केंद्रीकृत करना पसंद करता हूं जो सही आइटम सूची उत्पन्न करने के लिए आवश्यक सभी मॉडलों का उपयोग करेगा। – Stefano

1

मुझे लगता है कि आप मॉडल के बीच संदर्भ नहीं होना चाहिए, सही तरीके से इस लिंक के लिए नियंत्रक का उपयोग करने के लिए है। तो आपके मामले में आप GetUtems विधि में पैरामीटर के रूप में CurrentUser को पास कर सकते हैं।

+0

तो, आप कहते हैं कि मुझे कंट्रोलर 1 के अंदर दो मॉडलों का संदर्भ देना चाहिए और उसके बाद नियंत्रक 1.GetItems() मुझे चाहिए: 1) मॉडल 2.GetCurrentUser() को कॉल करें और उपयोगकर्ता को प्राप्त करें; 2) मॉडल 1.GetItems (उपयोगकर्ता) को उपयोगकर्ता को पास कर दें। सही? – Stefano

+0

हां, यदि इन 2 मॉडल का उपयोग उसी प्रवाह में किया जा रहा है, तो मुझे लगता है कि इसे एक नियंत्रक में करना समझदारी होगी। या यदि आपको अपने अमूर्त पैटर्न के हिस्से के रूप में मॉडलों के साथ नियंत्रकों की आवश्यकता है, तो आप एक तीसरे नियंत्रक का उपयोग कर सकते हैं जिसमें दोनों नियंत्रकों के संदर्भ हैं और वही करते हैं। – dain

3

यदि आपका दूसरा मॉडल अक्सर आपके द्वारा संदर्भित किया जा रहा है, तो आप अपने मॉडल वर्गों को एक अलग पुस्तकालय में संकलित कर सकते हैं?

+0

मॉडल कक्षाएं पहले से ही एक अलग असेंबली में संकलित हैं। इसके बारे में क्या समस्या है? मुझे समझ में नहीं आता – Stefano

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