假设我们有“用户”和“酒店”模型类。我使用User_Mapper和Hotel_Mapper来加载/保存/删除等。然后我想让用户能够标记他们的“最喜欢的”酒店。在数据库中,我有user_favourite_hotels
表,这是一个简单的链接表,同时还有一个用于订阅酒店更新的字段。
当列出用户最喜欢的酒店时,你如何从API的角度来看这个?我的一部分认为这应该是Hotel_Mapper上的“findFavouritesByUserId”方法,但不是说它“感觉”正确 - 但是同事建议“收藏夹”由用户拥有,因此应该在User_Mapper上。
也许我应该有一个User_Hotel_Favourites_Mapper?我想将“收藏夹”数据合并到User对象中,以便在User对象被保存和加载时。我不确定将它拆分为自己的对象和映射器是否更好。
对于如何最好地为上述和任何优点/缺点/体验设置API,我感激不尽。
非常感谢,
詹姆斯。
答案 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()
)。