【发布时间】: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