Ich arbeite so (Struts2 + Hibernate):
My Struts Actions ist nur für die Anzeige von Informationen im Webbrowser verantwortlich. Nicht denken.
Benutzer -> Aktion -> Dienst -> Repository -> Datenzugriff
Oder:
Ich möchte sehen -> wie man sieht -> was zu tun ist -> wie man kommt -> wo man kommt
Also, in der ersten Ebene (der Ansicht) habe ich etwas wie:
public String execute () {
try {
CourseService cs = new CourseService();
Course course = cs.getCourse(idCourse);
} catch (NotFoundException e) {
setMessageText("Course not found.");
} catch (Exception e) {
}
return "ok";
}
Wie Sie sehen, meine "Sicht" nicht denken. Es fragt nach einem Dienst (zum Verwalten von Kursen) für einen bestimmten Kurs. Dieser Service kann noch vieles mehr, wie Berichte, Suchanfragen und so weiter. Das Ergebnis ist immer eine Liste oder ein bestimmtes Objekt (wie im Beispiel). Die Services sind die eigentliche Maschine, wenden Regeln an und greifen auf das Repository zu (um die Daten zu verwalten).
Wenn ich also meine Dienste, Repositorys und DAOS in verschiedene Bibliotheken lege, kann ich sie sogar in einem textbasierten Programm oder in einem Windows-basierten Desktopsystem verwenden, ohne dass sich etwas ändert.
Der Dienst weiß, was zu tun ist, weiß aber nicht, wie zu zeigen ist. Die Ansicht kann zeigen, weiß aber nicht, was zu tun ist. Dasselbe gilt für Service / Repository: Der Service sendet und fordert die Daten an, weiß jedoch nicht, wo sich die Daten befinden und wie sie zu entnehmen sind. Das Repository "bildet" die Rohdaten, um Objekte zu erstellen, mit denen der Service arbeiten kann.
Das Repository weiß jedoch nichts über die Datenbank. Die Art der Datenbank (MySQL, PostgreSQL, ...) betrifft DAO.
Sie können das DAO ändern, wenn Sie die Datenbank ändern möchten, und es darf sich nicht auf die oberen Ebenen auswirken. Sie können das Repository ändern, wenn Sie Ihre Datenverwaltung aktualisieren möchten, dies darf jedoch keine Auswirkungen auf das DAO und die oberen Ebenen haben. Sie können die Dienste ändern, wenn Sie Ihre Logik ändern möchten, dies darf jedoch nicht mit den darüber oder darunter liegenden Ebenen zu tun haben.
Und Sie können alles in der Ansicht ändern, auch die Technologie (Web, Desktop, Text), aber dies darf nicht bedeuten, dass Sie etwas darunter berühren.
Die Geschäftslogik lautet Service. Aber wie man damit interagiert, ist zu sehen. Welche Schaltfläche soll jetzt angezeigt werden? Kann der Benutzer diesen Link sehen? Denken Sie, Ihr System ist ein konsolenbasiertes Programm: Sie müssen ablehnen, wenn der falsche Benutzer ihn auswählt #> myprogram -CourseService -option=getCourse -idCourse=234
oder anhält, um die Tasten zum Schreiben dieses Befehls zu drücken?
In webbasierten Systemen (Struts + JavaEE) habe ich ein separates GUI-Controller-Paket. In der Ansicht Aktion gebe ich dem angemeldeten Benutzer und die Klasse gibt mir die Schaltflächen (oder ein beliebiges von mir gewünschtes Oberflächenelement).
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
Und
private List<ActionButton> actionButtons;
Denken Sie daran, dies von den Diensten fernzuhalten. Das ist VIEW-Zeug. Behalten Sie es in den Struts-Aktionen bei. Alle Schnittstelleninteraktionen müssen vollständig vom tatsächlichen Geschäftscode getrennt sein. Wenn Sie also Ihr System portieren, ist es einfach zu schneiden, was Sie nicht mehr benötigen.