Я працюю так (Struts2 + Hibernate):
Мої дії Struts відповідають лише за інформацію про показ у веб-переглядачі. Не думаючи.
Користувач -> Дія -> Сервіс -> Репозиторій -> Доступ до даних
Або:
Я хочу бачити -> Як бачити -> Що робити -> Як дістатися -> Де дістатися
Отже, у першому шарі (вид) у мене є щось на кшталт:
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";
}
Як бачите, мій «погляд» не думаю. Це запит про надання послуги (для управління курсами) конкретного курсу. Цей сервіс може зробити багато іншого, як, наприклад, звіти, серачі тощо. Результати - це завжди список або конкретний об'єкт (як приклад). Служби - це справжня машина, застосовують правила та отримують доступ до сховища (для управління даними).
Отже, якщо я розміщую свої сервіси, сховища та DAOS в різних бібліотеках, я можу використовувати їх навіть у текстовій програмі або на настільній системі на основі Windows, нічого не змінюючи.
Сервіс знає, що робити, але не знає, як показати. Погляд знає, як показати, але не знає, що робити. Те саме з Сервісом / Репозиторієм: служба надсилає та запитує дані, але не знає, де дані і як їх взяти. Репозиторій "складає" необроблені дані для об'єктів, з якими Сервіс може працювати.
Але Репозиторій нічого не знає про базу даних. Вид бази даних (MySQL, PostgreSQL, ...) стосується DAO.
Ви можете змінити DAO, якщо хочете змінити базу даних, і вона не повинна впливати на верхні шари. Ви можете змінити сховище, якщо ви хочете оновити управління даними, але це не повинно впливати на DAO та верхні шари. Ви можете змінити Служби, якщо хочете змінити свою логіку, але це не повинно псуватись із шарами вище чи нижче.
І ви можете змінити будь-що в образі, навіть технологію (веб, робочий стіл, текст), але це не повинно означати, що стосується нічого нижче.
Логіка бізнесу - Сервіс. Але як взаємодіяти з цим - це переглянути. Яку кнопку показати зараз? Чи може користувач бачити це посилання? Подумайте, що ваша система - це консольна програма: ви повинні заборонити, якщо неправильний користувач вибере #> myprogram -CourseService -option=getCourse -idCourse=234
або зупинити його, щоб натиснути клавіші, щоб написати цю команду?
Якщо говорити у веб-системах (Struts + JavaEE), у мене є окремий пакет контролерів GUI. З огляду Дія, я надаю користувачеві, який зареєструвався, і клас дає мені кнопки (або будь-який елемент інтерфейсу, який я хочу).
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
І
private List<ActionButton> actionButtons;
Пам’ятайте, щоб це не було від служб. Це речі VIEW. Зберігайте це в дії Struts. Будь-які взаємодії з інтерфейсом повинні бути повністю відокремлені від реального ділового коду, тому, якщо ви портуєте свою систему, буде легко вирізати те, що вам більше не потрібно.