2012-06-02 18 views
8

मुझे contoller का संदर्भ रखने के लिए दृश्य की आवश्यकता है क्योंकि इसे नियंत्रक को ईवेंट श्रोता के रूप में पंजीकृत करने की आवश्यकता है। मुझे दृश्य के संदर्भ में contoller की आवश्यकता है, क्योंकि बटन क्लिक पर, मुझे चयनित फ़ाइलों को किसी सूची में प्राप्त करने में सक्षम होना चाहिए। (मैं फ़ाइलों की एक सूची है, और एक बटन 'क्लस्टर जोड़ें' है, इसलिए जब बटन क्लिक किया मैं चयनित फ़ाइलों प्राप्त करने की आवश्यकता)एमवीसी - परिपत्र निर्भरता

संक्षेप में

तो मेरे पास है:

Controller controller(view); 
View view(controller); 

मैं मीटर यकीन है कि वहाँ कुछ बुरा डिजाइन यहाँ है, मैं तो बस को समझ नहीं सकता कि यह कैसे से बचने के लिए ..

+0

[स्विंग किया] के रूप में करें (http://www.oracle.com/technetwork/java/architecture-142923.html) और नियंत्रक और दृश्य को गठबंधन करें। – Jeffrey

+0

मैं एमवीसी में ऐसा करने के खिलाफ बहस करता हूं क्योंकि मुझे याद है कि यह वास्तव में सर्वर साइड इवेंट हैंडलिंग के लिए नहीं बनाया गया है। शायद jQuery के साथ घटनाओं को संभालना बेहतर होगा। – Lilienthal

उत्तर

3

एक संभव समाधान:

  • सीधे शब्दों में नियंत्रक एक addView(View view) विधि दे
  • इसी तरह दृश्य के लिए इसे addController(Controller controller) विधि दें।
  • इसे अपने दस्तावेज़ों का हिस्सा बनाएं कि इन्हें उपयोग से पहले सेट किया जाना चाहिए।
  • सुनिश्चित करें कि आप जांच कर सकते हैं कि संदर्भ चर उन्हें उपयोग करने से पहले शून्य नहीं हैं, क्योंकि वे कन्स्ट्रक्टर में सेट नहीं होंगे।
+0

धन्यवाद। मैंने इसके बारे में सोचा लेकिन मुझे यकीन नहीं था कि यह सही था। – Shmoopy

+0

मुझे यकीन है कि दृश्य एमवीसी पैटर्न पर नियंत्रक पर निर्भर नहीं होना चाहिए: यह केवल मॉडल –

+0

पर निर्भर होना चाहिए आप सुझाव दे रहे हैं कि दृश्य में नियंत्रक का संदर्भ होना चाहिए: यह निर्भरता –

1

अच्छा, मेरा मानना ​​है कि आप encapsulation और आलसी प्रारंभिक प्रक्रिया का उपयोग कर सकते हैं। मुझे यकीन है कि आपको उसी पल में दृश्य की आवश्यकता नहीं है जब नियंत्रक प्रारंभ हो रहा है या इसके विपरीत। यदि नहीं, तो आप उपरोक्त उत्तर भी बीन्स के लिए आलसी init संपत्ति के संयोजन के साथ कर सकते हैं।

+1

मैं मूल पोस्टर नहीं हूं, लेकिन क्या आप इसका मतलब केवल एक संक्षिप्त उदाहरण दिखा सकते हैं? धन्यवाद! –

+0

वैसे मैं उसे सुझाव देना चाहता था, अगर नियंत्रक इंजेक्शन के बाद दृश्य की आवश्यकता होती है तो वह दृश्य को निम्नानुसार कॉन्फ़िगर कर सकता है: <बीन आईडी = "नियंत्रक" वर्ग = "com.ioc.MyController" /> <बीन आईडी = "व्यू" क्लास = "com.ioc.MyView" lazy-init = "true" /> इसे नियंत्रक के समक्ष आरंभ करने की आवश्यकता नहीं होगी। – dharam

+0

अद्यतन के लिए धन्यवाद! –

5

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

public interface Display { 
    public void registerEventListener(Listener aListener) 
    public List getSelectedFiles() 
} 

देखें कि इंटरफ़ेस को लागू करते हैं::

public class View implements Display{ 
//The method implementations 
} 

और में सभी आवश्यक बाइंडिंग बनाने

एक प्रदर्शन inteface को परिभाषित करें नियंत्रक:

public class Controller{ 
    private Display view; 
    public Controller(){ 
     //Or use some DI technology 
     this.view = new View(); 
     //Get a Listener implementation, maybe an Anonymous Inner Class 
     this.view.registerEventListener(getListener()); 
    } 

    public void processFiles(){ 
     List files = view.getSelectedFiles(); 
     //Do the processing here 
    } 

} 
0

दृश्य और नियंत्रक को ठीक से बाध्य करने के लिए * .asp पर राइट क्लिक करें एक्स पेज और "नियंत्रक पर जाएं" मेनू का चयन करें। अब सम्मानित नियंत्रक में निम्नलिखित वाक्यविन्यास के साथ एक विधि जोड़ें।

public ActionResult viewName() 
{ 
    return view() 
} 

जहां दृश्यनाम पूर्व के लिए आपके विचार का नाम है। innet में यह एएसपीएक्स एक्सटेंशन के बिना पृष्ठ का नाम है, अब जब आप सही पर क्लिक करेंगे और मेनू "दृश्य पर जाएं" का चयन करेंगे जो आपको सम्मानित पृष्ठ पर ले जाएगा, यह पुष्टि करता है कि आप आर व्यू और कंट्रोलर को अच्छी तरह से बांध चुके हैं।

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