Должен ли я абстрагировать уровень обслуживания на стороне клиента, и если да, то как?
Дело в том, что я использую Hibernate на стороне сервера и посылаю клиенту в основном "необработанные" данные базы данных - это нормально, но это также означает, что мой клиент получает List<UpcomingEventDTO>
при звонке в соответствующую службу, которая является просто списком from
указанная дата to
другой.
Если я теперь хочу разделить эти события на карту, где ключи отображаются на списки событий одного дня, например, Map<Integer, List<UpcomingEventDTO>>
тогда мне придется сделать это на стороне клиента. Это не беспокоило бы меня, если бы мне не пришлось делать это в моем докладчике.
С одной стороны, у меня есть загрузка в моем докладчике:
private void loadUpcomingEvents(final Integer calendarWeekOffset) {
new XsrfRequest<StoreServletAsync, List<UpcomingEventDTO>>(this.storeServlet) {
@Override
protected void onCall(AsyncCallback<List<UpcomingEventDTO>> asyncCallback) {
storeServlet.getUpcomingEventsForCalendarWeek(storeId, calendarWeekOffset, asyncCallback);
}
@Override
protected void onFailure(Throwable caught) {
}
@Override
protected void onSuccess(List<UpcomingEventDTO> result) {
upcomingEvents = result;
presentUpcomingEvents();
}
}.request();
}
и преобразование данных, прежде чем я могу представить это:
private void presentUpcomingEvents() {
Map<Integer, List<UpcomingEventDTO>> dayToUpcomingEvent = new HashMap<>();
for (UpcomingEventDTO upcomingEvent : this.upcomingEvents) {
@SuppressWarnings("deprecation")
Integer day = upcomingEvent.getDate().getDay();
List<UpcomingEventDTO> upcomingEvents = dayToUpcomingEvent.get(day);
if(upcomingEvents == null) {
upcomingEvents = new ArrayList<>();
}
upcomingEvents.add(upcomingEvent);
dayToUpcomingEvent.put(day, upcomingEvents);
}
List<Integer> days = new ArrayList<Integer>(dayToUpcomingEvent.keySet());
Collections.sort(days);
this.calendarWeekView.removeUpcomingEvent();
for(Integer day : days) {
CalendarDayPresenterImpl eventCalendarDayPresenter = null;
eventCalendarDayPresenter = this.dayToEventCalendarDayPresenter.get(day);
if(eventCalendarDayPresenter == null) {
List<UpcomingEventDTO> upcomingEvents = dayToUpcomingEvent.get(day);
eventCalendarDayPresenter = new CalendarDayPresenterImpl(upcomingEvents);
this.dayToEventCalendarDayPresenter.put(day, eventCalendarDayPresenter);
}
this.calendarWeekView.appendEventCalendarDay(eventCalendarDayPresenter.getView());
}
}
Поэтому моя проблема в основном в том, что я не очень доволен тем, что в моем докладчике есть такой код, но, с другой стороны, я не знаю, как и где предоставить данные в этой "обновленной" форме для моих докладчиков.
Можно было бы возразить и сказать, что я также мог бы просто возвращать данные с сервера так, как мне нужно на сервере, но тогда я бы потерял общность и не хотел бы писать для всех представлений и докладчиков свой "собственный" API в базу данных.
Другой возможностью может быть, например, введение другого уровня между уровнем сервиса / сервлета и иметь что-то вроде уровня DAO или базы данных до моей модели докладчиков. Но это также подняло бы много вопросов для меня. Например, как будет называться такой слой ^^, и будет ли этот слой обеспечивать данные для настройки докладчиков или данные будут по-прежнему обобщенными?
У меня довольно большая проблема с выяснением того, что делать здесь, поэтому я надеюсь, что смогу извлечь пользу из чьего-то опыта.
Большое спасибо за любую помощь здесь!
1 ответ
Логика представления должна быть на стороне сервера на уровне контроллера, где она предназначена для подготовки представления для клиентов. (Шаблон MVC) И если многие представления хотят использовать это, вы можете создать абстрактный контроллер, который можно повторно использовать для других представлений.
Также хорошо подготовить ваш уровень контроллера к будущим требованиям. Спросите себя, не попросит ли другой клиент представить данные с различной степенью детализации? Может быть, показать предстоящие события по месяцам / времени? Следовательно, вы должны предоставить своему API гранулярность enC UPCOMING_EVENTS_DAY_GRANULARITY( DAY, MONTH, HOUR) в качестве параметра метода, чтобы вы могли заставить клиента решать, чего он хочет.
И чтобы сделать его более красивым, вы также можете сказать, переименовать / переместить слой контроллера в слой веб-сервиса, который можно рассматривать как ваш будущий API для внешних систем (не только для ваших представлений, но и для всех, кто находится за пределами вашей системы).