Я работаю так (Struts2 + Hibernate):
My Struts Actions отвечает только за отображение информации в веб-браузере. Не думая
Пользователь -> Действие -> Служба -> Хранилище -> Доступ к данным
Или:
Хочу посмотреть -> Как увидеть -> Что делать -> Как добраться -> Где взять
Итак, в первом слое (вид) у меня есть что-то вроде:
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;
Не забудьте не допускать этого к услугам. Это ПРОСМОТР вещи. Держите это в Struts Actions. Любое взаимодействие с интерфейсом должно быть полностью отделено от реального бизнес-кода, поэтому, если вы перенесете свою систему, вам будет легко сократить то, что вам больше не нужно.