我应该在客户端抽象服务层,如果是,如何?

时间:2015-08-27 18:15:53

标签: java hibernate gwt abstraction-layer

问题是我在服务器端使用Hibernate并且我基本上将“ raw ”数据库数据发送到客户端 - 这很好我想但这也意味着我的客户端得到了调用相应服务时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。

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

我有一个很大的问题,想知道在这里做什么,所以我希望我可以从某些人的经验中受益。

非常感谢你们的帮助!

1 个答案:

答案 0 :(得分:-1)

表示逻辑应位于控制器层的服务器端,用于为客户端准备视图。 (MVC模式) 如果许多视图想要使用它,您可以创建一个可以重用于其他视图的抽象控制器。

还可以为未来的要求准备控制器层。问问自己另一个客户是否会要求以不同的粒度呈现数据?可能按月/时间显示即将举行的活动?因此,您必须为您的API提供粒度枚举UPCOMING_EVENTS_DAY_GRANULARITY(DAY,MONTH,HOUR)作为方法参数,以便您让客户决定他们想要什么。

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