Pracuję w ten sposób (Struts2 + Hibernacja):
My Struts Actions odpowiada tylko za wyświetlanie informacji w przeglądarce internetowej. Nie myśląc.
Użytkownik -> Akcja -> Usługa -> Repozytorium -> Dostęp do danych
Lub:
Chcę zobaczyć -> Jak zobaczyć -> Co robić -> Jak zdobyć -> Gdzie zdobyć
Tak więc w pierwszej warstwie (widok) mam coś takiego:
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";
}
Jak widzisz, mój „pogląd” nie myśli. To prosi o usługę (do zarządzania kursami) konkretnego kursu. Ta usługa może zrobić wiele innych rzeczy, takich jak raporty, usługi i tak dalej. Wynikiem jest zawsze lista lub określony obiekt (jak w przykładzie). Usługi są prawdziwą maszyną, stosują reguły i mają dostęp do repozytorium (w celu zarządzania danymi).
Tak więc, jeśli umieszczę moje Usługi, Repozytoria i DAOS w różnych bibliotekach, będę mógł ich używać nawet w programie tekstowym lub systemie stacjonarnym opartym na Windowsie, który niczego nie zmieni.
Serwis wie, co robić, ale nie wie, jak to pokazać. Widok wie, jak pokazać, ale nie wie, co robić. To samo z usługą / repozytorium: usługa wysyła i żąda danych, ale nie wie, gdzie są dane i jak je zabrać. Repozytorium „uzupełnia” nieprzetworzone dane do obiektów biznesowych, aby usługa mogła z nimi pracować.
Ale repozytorium nic nie wie o bazie danych. Rodzaj bazy danych (MySQL, PostgreSQL, ...) dotyczy DAO.
Możesz zmienić DAO, jeśli chcesz zmienić bazę danych i nie może ona wpływać na górne warstwy. Możesz zmienić repozytorium, jeśli chcesz zaktualizować zarządzanie danymi, ale nie może to wpłynąć na DAO i wyższe warstwy. Możesz zmienić Usługi, jeśli chcesz zmienić logikę, ale nie może to zepsuć się warstwami powyżej lub poniżej.
I możesz zmienić wszystko w widoku, nawet technologię (sieć, pulpit, tekst), ale nie może to sugerować niczego poniżej.
Logiką biznesową jest usługa. Ale jak z tym współdziałać, to przeglądać. Jaki przycisk pokazać teraz? Czy użytkownik może zobaczyć ten link? Myślisz, że twój system jest programem konsolowym: musisz zaprzeczyć, jeśli zły użytkownik wybierze #> myprogram -CourseService -option=getCourse -idCourse=234
lub zatrzymać go, aby naciskał klawisze, aby napisać to polecenie?
Mówiąc w systemach internetowych (Struts + JavaEE) mam osobny pakiet kontrolera GUI. W widoku Działanie daję zalogowanemu użytkownikowi, a klasa daje mi przyciski (lub dowolny element interfejsu, który chcę).
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
I
private List<ActionButton> actionButtons;
Pamiętaj, aby trzymać to z daleka od usług. To jest WIDOK. Trzymaj go w Akcjach Struts. Wszelkie interakcje interfejsu muszą być całkowicie oddzielone od prawdziwego kodu biznesowego, więc jeśli przeniesiesz swój system, łatwo będzie wyciąć to, czego już nie potrzebujesz.