Data Mapper API - 不确定组织

时间:2010-07-07 07:33:59

标签: oop design-patterns datamapper

假设我们有“用户”和“酒店”模型类。我使用User_Mapper和Hotel_Mapper来加载/保存/删除等。然后我想让用户能够标记他们的“最喜欢的”酒店。在数据库中,我有user_favourite_hotels表,这是一个简单的链接表,同时还有一个用于订阅酒店更新的字段。

当列出用户最喜欢的酒店时,如何从API的角度来看这个?我的一部分认为这应该是Hotel_Mapper上的“findFavouritesByUserId”方法,但不是说它“感觉”正确 - 但是同事建议“收藏夹”由用户拥有,因此应该在User_Mapper上。

也许我应该有一个User_Hotel_Favourites_Mapper?我想将“收藏夹”数据合并到User对象中,以便在User对象被保存和加载时。我不确定将它拆分为自己的对象和映射器是否更好。

对于如何最好地为上述和任何优点/缺点/体验设置API,我感激不尽。

非常感谢,

詹姆斯。

3 个答案:

答案 0 :(得分:2)

这个(诚然已退休)patterns&practices guide to designing data tier components建议您将该方法放在您从通话中返回的对象类型的映射器中。

  

如果您有返回特定类型的业务实体的方法,请将这些方法放在该类型的数据访问逻辑组件中。例如,如果要检索客户的所有订单,请在订单数据访问逻辑组件中实现该功能,因为您的返回值是Order类型。相反,如果您要检索订购了特定产品的所有客户,请在客户数据访问逻辑组件中实现该功能。

所以,在你的例子中,它将在Hotel Mapper中返回,因为它将返回Hotels。

答案 1 :(得分:1)

如果您想为用户存储最喜欢的酒店,您使用的是UserMapper,它注意到User的域对象有更改收藏夹,并为用户和user_favorite_hotels更新了两个表(您只需要酒店ID。)

当您检索某些用户的收藏酒店时,您使用HotelMapper并将过滤器设置为基于User,因为您将使用Hotel的实例。

答案 2 :(得分:0)

考虑到这是在两年多前提出来的,我不确定答案现在对您是否重要。但无论如何,这就是我的想法。

如果User可能有多种类型的收藏(包括Hotel s),那么有UserFavourites抽象来覆盖所有可能的收藏类型可能是有意义的。 UserFavourites可以公开getItems()方法来获取基础收藏夹。

这可以在管理器类的帮助下进行管理,以返回可以调用FavouriteHotels方法的相应收藏夹对象(例如getItems())。