【问题标题】:Should I abstract the service layer on the client side and if yes how?我应该在客户端抽象服务层吗?如果是,如何?
【发布时间】:2015-08-27 18:15:53
【问题描述】:

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

如果我现在想将这些事件拆分为一个映射,其中键映射到 一天 的事件列表,例如Map<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 或数据库层的东西。但这也会对我提出很多问题。例如。这样一个层的名称是什么^^,该层会为演示者提供“自定义”数据,还是数据仍然是通用的?

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

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

【问题讨论】:

  • 当您尝试抽象应用程序的某些部分时,问自己一个问题 - 该层会在其他任何地方使用或重用吗?我的意思是,如果你让它看起来更好引入这个新层,它会在以后付钱给你吗?应用程序会变得更有效吗?您的团队成员在阅读/编辑此类优化代码时会变得更有效率吗?对于从服务器返回的数据应该是什么样子(原始的或准备好的),我的团队有各种意见。虽然我们在大多数情况下保持一致,但我们使用不同的方法。还要计算后端/前端性能和带宽使用情况。

标签: java hibernate gwt abstraction-layer


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 2019-11-20
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多