2012-06-02 14 views
8

Ich brauche die Ansicht, um einen Verweis auf den Controller zu halten, weil es den Controller als Ereignis-Listener registrieren muss. Ich brauche den Controller, um einen Verweis auf die Ansicht zu halten, denn nach einem Klick muss ich in der Lage sein, die ausgewählten Dateien in eine Liste zu bekommen. (Ich habe eine Liste von Dateien und eine Schaltfläche ‚Hinzufügen Cluster‘, also, wenn die Schaltfläche geklickt wird Ich brauche die ausgewählten Dateien zu erhalten)MVC - zirkuläre Abhängigkeit

Also kurz gesagt ich habe:

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

I‘ m sicher, dass einige schlechte Design hier gibt es, ich kann einfach nicht herausfinden, wie es zu vermeiden ..

+0

Tun Sie als [Swing did] (http://www.oracle.com/technetwork/java/architecture-142923.html) und kombinieren Sie den Controller und die Ansicht. – Jeffrey

+0

Ich würde dagegen argumentieren, dies in MVC zu tun, von dem, was ich mich erinnere, ist es nicht wirklich für Server Side Event Handling gemacht. Eventuell würde die Behandlung von Ereignissen mit jQuery hier besser passen. – Lilienthal

Antwort

3

eine mögliche Lösung:

  • einfach geben Controller eine addView(View view) Methode
  • Ebenso für View geben Sie eine addController(Controller controller) Methode.
  • Machen Sie es Teil Ihrer Dokumentation, dass diese vor der Verwendung festgelegt werden müssen.
  • Stellen Sie sicher, dass die Referenzvariablen nicht null sind, bevor Sie sie verwenden, da sie nicht im Konstruktor festgelegt werden.
+0

Danke. Ich dachte darüber nach, war mir aber nicht sicher, ob es richtig war. – Shmoopy

+0

Ich bin mir ziemlich sicher, View sollte nicht auf Controller auf MVC-Muster abhängen: Es muss nur Modell –

+0

Sie vermuten, dass die Ansicht einen Verweis auf den Controller haben sollte: Das ist eine Abhängigkeit –

1

Nun, ich glaube, Sie können Kapselung und auch die faule Initialisierung verwenden. Ich bin sicher, dass Sie die Ansicht nicht im selben Moment benötigen, wenn der Controller initialisiert wird oder umgekehrt. Wenn nicht, können Sie die obige Antwort auch in Verbindung mit der lazy-init-Eigenschaft für Beans ausführen.

+1

Ich bin nicht das Originalplakat, aber kannst du ein kurzes Beispiel zeigen, was du meinst? Vielen Dank! –

+0

Nun, was ich vorschlagen wollte war, wenn die Ansicht benötigt wird, nachdem der Controller injiziert wird, dann kann er die Ansicht wie folgt konfigurieren: Dies erfordert nicht, dass die Ansicht vor dem Controller initialisiert wird. – dharam

+0

Danke für das Update! –

5

Ich bin mir nicht sicher, welche Java-Technologien Sie verwenden, aber in GWT-Anwendungen - und MVP-Muster verwenden - muss die View keinen Verweis auf den Controller haben: Die gesamte Kommunikation zwischen dem Controller (oder Presenter) und die Ansicht erfolgt über eine Schnittstelle, die von View implementiert wird. In Ihrem Fall sollten Sie den Code wie folgt aussehen:

definieren inteface Anzeige:

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

Lassen Sie die Ansicht, dass die Schnittstelle implementieren:

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

Und machen alle notwendigen Bindungen in der Controller:

0

Um Ansicht und Controller richtig zu binden, klicken Sie bitte auf * .asp x Seite und wählen Sie "Gehe zum Controller" -Menü. Fügen Sie nun in dem respektierten Controller eine Methode mit der folgenden Syntax hinzu.

public ActionResult viewName() 
{ 
    return view() 
} 

Dabei ist viewname der Name Ihrer Ansicht für ex. in .net ist der Name der Seite ohne Aspx-Erweiterung Wenn Sie jetzt mit der rechten Maustaste auf Ansicht klicken und das Menü "Zur Ansicht" wählen, das Sie zur gewünschten Seite bewegt, bestätigt dies, dass Sie die Ansicht und den Controller gut verknüpft haben.

Verwandte Themen