0

问题是我在服务器端使用 Hibernate,并且我基本上将“原始”数据库数据发送到客户端 - 我猜这很好,但这也意味着我的客户端List<UpcomingEventDTO>在调用相应的服务时得到一个列出from一个指定的日期to另一个。

如果我现在想将这些事件拆分为一个映射,其中键映射到一天的事件列表,例如 aMap<Integer, List<UpcomingEventDTO>>那么我将不得不在客户端执行此操作。如果我不必在我的 Presenter 中这样做,这不会打扰我。

一方面,我的演示者正在加载:

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到数据库。

另一种可能性是,例如在服务/servlet 层之间引入另一个层,并在我的演示者模型之前具有类似 DAO 或数据库层的东西。但这也会对我提出很多问题。例如,这样一个层的名称是什么^^,该层是否会为演示者提供“自定义”数据,或者数据是否仍然是通用的?

我在弄清楚在这里做什么时遇到了很大的问题,所以我希望我能从别人的经验中受益。

非常感谢这里的任何帮助!

4

1 回答 1

-1

表示逻辑应该在控制器层的服务器端,它意味着为客户端准备视图。(MVC 模式)如果很多视图都想使用它,你可以制作一个抽象控制器,它可以被其他视图重用。

为未来的需求准备你的控制器层也很好。问问自己,其他客户是否会要求以不同的粒度呈现数据?可以按月/时间显示即将发生的事件吗?因此,您必须为您的 API 提供粒度枚举 UPCOMING_EVENTS_DAY_GRANULARITY(DAY, MONTH, HOUR) 作为方法参数,以便让客户决定他们想要什么。

为了使它更漂亮,您还可以将控制器层重命名/移动到 Web 服务层,这可以被视为您未来的外部系统 API(不仅适用于您的视图,还适用于您系统外的任何人)..

于 2015-08-28T08:02:47.390 回答