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?
Antworten:
Meiner Meinung nach muss man zwischen dem MVC-Muster und der 3-Tier-Architektur unterscheiden. Um zusammenzufassen:
3-Tier-Architektur:
Das MVC-Muster findet in der Präsentationsebene der obigen Architektur statt (für eine Webanwendung):
Lebenszyklus einer typischen HTTP-Anfrage:
quelle
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 .
quelle
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.
quelle