Lor*_*ill 18 orm datamapper repository repository-pattern domain-model
好吧,我一直试图找出数据映射器和存储库之间的区别,但到目前为止我还没有.在我看来,专家程序员说"存储库是查询构造代码集中的映射层的另一个抽象层".这似乎可以理解,但仍然有点抽象.我之前读过stackoverflow上的这篇文章,它让我更加困惑: Data Mapper模式与存储库模式有何不同?
我想我需要的是关于两种模式如何不同的简单解释和具体/实际示例,以及数据映射器不具备的存储库,反之亦然.你们中的任何人都知道一个关于说明数据映射器和存储库概念的好例子吗?如果它是相同的示例,只有一个使用数据映射器而另一个使用存储库会更好.谢谢,我非常感谢.到目前为止我仍然很困惑......
And*_*rei 24
假设你的应用程序管理Person的对象,具有每个实例name,age和jobTitle性质.
您希望保留此类对象,然后从持久性介质中检索并更新(例如,在他们的生日,增加日期)或删除.这些任务通常称为CRUD,来自Create,Read,Update和Delete.
最好将"业务"逻辑与处理Person对象持久性的逻辑分离开来.这允许您更改持久性逻辑(例如,从数据库到分布式文件系统),而不会影响您的业务逻辑.
你通过封装一个后面的所有持久性逻辑来做到这一点Repository.假设PersonRepository(或Repository<Person>)允许您编写如下代码:
Person johnDoe = personRepository.get(p=> p.name == "John Doe");
johnDoe.jobTitle = "IT Specialist";
personRepository.update(johnDoe);
这只是业务逻辑,并不关心对象的存储方式和位置.
在另一方面Repository,您使用a DataMapper和从功能描述转换查询的p=> p.name == "John Doe"东西(到持久层理解的东西).
您的持久层可以是DB,在这种情况下,DataMapper将Person对象转换为a中的行PersonsTable.然后,查询转换器将功能查询转换为SELECT * FROM PersonsTable WHERE name == "John Doe".
另一个持久层可以是文件系统,或用来选择将存储另一个DB格式Person在两个表中的对象,PersonAge和PersonJobTitle.
在后一种情况下,DataMapper任务是将johnDoe对象转换为2行:一行用于PersonAge表,一行用于PersonJobTitle表.然后,查询逻辑需要将功能查询转换为join两个表上的a .最后,DataMapper需要知道如何Person从查询的结果构造对象.
在大型复杂系统中,您希望使用可以独立开发和测试的小型,明确定义的小组件:
Repository它何时想要读取或持久化对象,而不关心如何实现它.Repository一个交易DataMapper,当它想读/在一个特定的持久化中写的对象.Repository依赖于由DataMapper(例如,在表jobTitle中的JobTitle列中找到的值)提供的模式,PersonTable但不依赖于映射器的任何实现.DataMapper依赖于数据库层,使其免受Oracle/Sybase/MSSQL/OtherProvider详细信息的影响.这些模式并没有"不同",它们只是暴露出不同的基本特征.
sha*_*een 20
我意识到这个答案有点晚了,但它可能会帮助将来偶然发现同样的问题,并发现可用的答案并没有完全回答这个问题(当我第一次遇到这个问题时我感觉到了这个问题) ).
在阅读了PoEAA(Martin Fowler)之后,我也无法识别数据映射器和存储库之间的区别.
这就是我发现这两个概念最终归结为:
存储库是一个通用的概念,并不一定要将任何东西存储到数据库中,它的主要功能是提供对域对象的集合(对查询启用)访问(无论它们是从数据库获得的还是该点).存储库可能(通常会)包含DataMappers本身.
DataMappers充当域对象和数据库之间的中间层,允许它们独立地进化而不依赖于另一个.Datamappers可能具有"查找"或查询功能,但这并不是它们的主要功能.您发现在DataMappers中使用精细查询逻辑的次数越多,您就越想开始考虑将查询逻辑解耦到存储库中,同时让DataMappers为其主函数服务,将域对象映射到数据库,反之亦然.