数据映射器模式和仓储模式有何不同?

33

2
如果您的数据映射器太大或处理大量查询而不是实际映射对象,则可以引入另一个类来专注于仅查询部分,将其命名为存储库模式。 - Rockstart
很少有机会从存储库层中受益。这意味着,使用存储库可能有助于某些复杂系统。 - Handsome Nerd
1个回答

46

[Repository] 是对映射层的另一层抽象,专门处理查询构建代码。

DataMapper 确保数据库不需要知道业务逻辑及数据对象在内存中的保存方式,而业务端也无需了解数据的存储方式。

举例来说,假设你的数据以一行一行的方式保存在数据库中,每一行代表着商店里的一个商品。但在内存中,你可能不希望将这些信息保存为一个 StoreItem 列表,而希望将其分成两个列表,一个列出有库存的商品,另一个列出没有库存的商品。这就是 DataMapper 的工作,它可以处理从一个列表到两个列表之间的转换。

如果你想在业务端添加其他对象列表或继承等复杂情况,DataMapper 就需要将其转换为关系型数据库所能理解的形式。

而 'Repository' 则为业务端提供了类似 "SELECT * FROM table WHERE condition" 的功能,你只需要提供一个过滤器,它就会返回与该过滤器匹配的对象集合。

简而言之,DataMapper 处理单个对象,而 'Repository' 处理对象集合,并扩展了 DataMapper 的功能。


1
@LordYggdrasill 如果你对某个特定框架有具体问题,应该在这个网站上以问题的形式提出。查询和映射是逻辑上不同的任务,但它们的实现通常紧密耦合,这可能解释了为什么一些人(需要引用)选择将它们视为一体。 - Andrei
1
好的,在这里我有一个来自ASP.NET网站的例子。正如你所看到的,他们对仓储模式(Repository pattern)的实现与Martin Fowler在POEAA中的数据映射器(Data Mapper)完全相同。你知道如何解释这个现象吗?也许ASP.NET的仓储实际上就是一个数据映射器? http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application - Lord Yggdrasill
1
@LordYggdrasill 该存储库处理查询。这并不意味着如果一个类执行的不是查询操作,它就不是存储库,而是如果一个类提供查询功能,那么它就是一个存储库。在示例链接中,数据映射部分被委托给了DbSet。Fowler的著作并非圣经,您可以选择忽略它们或根据应用程序最佳适用方式进行解释(尽管您不应该这样做)。如果您有其他问题,请发布单独的问题,而不是在两年前的评论区讨论。 - Andrei
最后一句话为我总结了一切。谢谢! - steadweb
2
我不明白的是,负责关系的解决。比如说,我想获取一个List<Subscription>,每个Subscription都有一个List<AddOn>。我可以在存储库层获取所有这些数据并返回它们,但是存储库是否会执行实际上是映射层工作的任务呢? - Stefan Falk
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接