In MVC sollte DAO von Controller oder Model aufgerufen werden

14

Ich habe verschiedene Argumente dafür gesehen, dass DAO direkt von der Controller-Klasse und auch von der Model-Klasse aufgerufen wird. Ich persönlich bin der Meinung, dass der Controller nicht mit DAO, sondern mit der Model-Klasse gekoppelt werden sollte, wenn wir dem MVC-Muster folgen sollte das DAO von innen aufrufen und der Controller sollte die Modellklasse aufrufen. Warum können wir die Modellklasse abgesehen von einer Webanwendung entkoppeln und die Funktionalitäten auf verschiedene Arten verfügbar machen, z. B. damit ein REST-Service unsere Modellklasse verwendet.

Wenn wir den DAO-Aufruf in den Controller schreiben, ist es für einen REST-Service nicht möglich, die Funktionalität wiederzuverwenden, oder? Ich habe beide Ansätze unten zusammengefasst.

Ansatz Nr. 1

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            new CustomerDAO().save(customer);

    }


 }

Ansatz 2

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            customer.save(customer);

    }


 }

 public class Customer {

   ...........

   private void save(Customer customer){

        new CustomerDAO().save(customer);

   }

}

Hinweis -

Hier ist eine Definition von Modell:

Modell: Das Modell verwaltet das Verhalten und die Daten der Anwendungsdomäne, antwortet auf Anfragen nach Informationen über den Status (normalerweise aus der Ansicht) und auf Anweisungen zum Ändern des Status (normalerweise vom Controller).

In ereignisgesteuerten Systemen benachrichtigt das Modell Beobachter (normalerweise Ansichten), wenn sich die Informationen ändern, damit sie reagieren können.

Ich würde eine Expertenmeinung dazu benötigen, da ich viele finde, die # 1 oder # 2 verwenden. Also welche ist es?


quelle
Der Controller sollte alles aus dem Modell laden und an die Ansicht übergeben.
jgauffin
Sind Sie Vorschlag Ansatz # 2?
1
Ein Controller kann Befehle an die ihm zugeordnete Ansicht senden, um die Darstellung des Modells in der Ansicht zu ändern (z. B. durch Scrollen durch ein Dokument). Er kann Befehle an das Modell senden, um den Status des Modells zu aktualisieren (z. B. ein Dokument zu bearbeiten). ..emm .. wo steht, dass der Controller Daten extrahieren oder weitergeben soll?
Mefisto

Antworten:

31

Meiner Meinung nach muss man zwischen dem MVC-Muster und der 3-Tier-Architektur unterscheiden. Um zusammenzufassen:

3-Tier-Architektur:

  • Daten: dauerhafte Daten;
  • service: logischer Teil der Anwendung;
  • Präsentation: hmi, Webservice ...

Das MVC-Muster findet in der Präsentationsebene der obigen Architektur statt (für eine Webanwendung):

  • Daten: ...;
  • Bedienung: ...;
  • Präsentation:
    • controller: fängt die HTTP-Anforderung ab und gibt die HTTP-Antwort zurück;
    • Modell: speichert anzuzeigende / zu behandelnde Daten;
    • Ansicht: organisiert die Ausgabe / Anzeige.

Lebenszyklus einer typischen HTTP-Anfrage:

  1. Der Benutzer sendet die HTTP-Anforderung.
  2. Der Controller fängt es ab.
  3. Der Controller ruft den entsprechenden Dienst an.
  4. Der Dienst ruft das entsprechende Dao auf, das beispielsweise einige persistente Daten zurückgibt.
  5. Der Dienst behandelt die Daten und gibt sie an den Controller zurück.
  6. Der Controller speichert die Daten im entsprechenden Modell und ruft die entsprechende Ansicht auf.
  7. Die Ansicht wird mit den Modelldaten instanziiert und als HTTP-Antwort zurückgegeben.
sp00m
quelle
Was Sie "Lebenszyklus einer typischen HTTP-Anforderung" nennen, ist nicht MVC. Und DAO ist nur ein Objekt, das die Interaktion / Übersetzung zwischen Domänenlogik und Persistenz erleichtert. Es ist KEIN anderer Name für den aktiven Datensatz. Also .. seit wann ist Model Teil der Präsentation geworden ?!
Mefisto
1
@teresko 1) Ja, es ist MVC, aber innerhalb einer 3-Tier-Architektur. Wenn nein, warum? 2) Du hattest recht, ich redigierte. 3) Da das gesamte MVC-Muster in der Präsentationsschicht stattfindet. Typisches Beispiel: Spring MVC, dessen Modelle nur Maps sind, die Schlüssel-Wert-Paare enthalten. Auch SpringFuse hat diese Wahl getroffen.
sp00m 15.11.12
2
Ich muss hier @ sp00m zustimmen ... Seine Beschreibung einer typischen HTTP-Anforderung ist für eine MVC-Webanwendung korrekt, und seine Positionierung des Modells (als 'M' in MVC) als Teil der Präsentationsebene ist ebenfalls korrekt . In n-Tier-MVC-Apps ist das "Modell" in der Regel die Fassade der Präsentationsebene über den restlichen Ebenen.
Eric King
8

Aus der Modellebene.

Genauer gesagt: von Diensten, die in der Modellschicht enthalten sind , weil sie die Interaktion zwischen Domänenobjekten und Speicherlogikabstraktionen steuern.

Der Controller sollte nur für die Änderung des Status der Modellschicht verantwortlich sein. DAOs sind Teil des Persistenzmechanismus. Dies ist Teil der Domänengeschäfts- und Anwendungslogik. Wenn Sie anfangen, mit DAOs in Controller zu interagieren, verlieren Sie die Domänenlogik in der Präsentationsebene .

Mefisto
quelle
Um eine Service-Schicht zu verwenden, sollte es sich um ein DDD-Muster handeln. korrigiere mich, wenn ich falsch liege. Haben wir eine Serviceschicht in MVC?
Du kannst haben. Dienste werden verwendet, um die Domänenlogik von der Anwendungslogik zu trennen. Dies wird erforderlich, und Sie wechseln von reinen CRUD-Domänenstrukturen (aktiver Datensatz) zu etwas, das die Speicherlogik von der Domänenlogik trennt. In der vollständig realisierten Modellschicht gibt es drei logische Trennungen: Persistenz, Domäne und Anwendung.
Mefisto
3

Ich bin mir nicht sicher, was das offizielle MVC-Muster erfordert, aber ich möchte normalerweise eine "Service" -Schicht zwischen den Controllern und den DAOs haben. Der Controller ruft Daten aus der Anforderung ab und leitet sie an die entsprechende Serviceklasse weiter. Die Serviceklasse ist dafür verantwortlich, ein oder mehrere DAOs aufzurufen, die Modellklassen zurückgeben. Diese Modellklassen werden dann an den Controller zurückgesendet, um an die Ansichtsebene gesendet zu werden. Das Einfügen der Service-Schicht hilft bei der Wiederverwendung, da mehrere Controller die gleichen Service-Schicht-Methoden verwenden können.

Shane
quelle