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



问题是,我在服务器端使用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到数据库。

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

我有一个相当大的问题弄清楚要做什么,所以我希望我能从别人的经验中受益。

非常感谢您的帮助!

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

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

为了让它更漂亮,你也可以说重命名/移动控制器层到一个webservice层,它可以被认为是你未来的外部系统的API(不仅为你的视图,也为你的系统外的任何人).

相关内容

  • 没有找到相关文章

最新更新