Должен ли я абстрагировать уровень обслуживания на стороне клиента, и если да, то как?

Дело в том, что я использую 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 для внешних систем (не только для ваших представлений, но и для всех, кто находится за пределами вашей системы).

Другие вопросы по тегам