阅读了几篇文章后,我开始理解 DAO 和存储库之间的区别,但我发现自己在尝试理解存储库和服务之间的区别时遇到了麻烦。
简而言之,在 OO 范式中:
DAO:包含基本的类CRUD operations
对于一个实体类。它具有获取或检索底层持久存储系统的内容所需的代码。一般来说,这些方法接收对象实体作为参数,但在retrieve
使用标识符类型有效的方法。
存储库:在更高的抽象级别中......正如我通常读到的那样,这是放置处理聚合对象(具有子对象的对象)操作的代码的地方。它使用DAO
从数据库中检索对象,最后它公开了领域“业务”语言的接口。 (但是,我再次认为使用 ids 的数据类型是非常有效的)。示例:一个非常简单的addSomething
where something
顺便说一句,是父对象的子对象,其实例由存储库作为一个整体进行管理。
Services:同样,它处于更高的抽象层次。以我的拙见,它们是连接两个不共享父子关系但与存储库一样远(抽象术语)的类的好地方。示例:方法transferCash
两个之间bank accounts
.
所以,这就是我的读物,但我在这里问上述想法是否正确。或者说我应该怎么想。或者让我真正理解所有这些概念的差异的东西。
一些来源:
- http://debasishg.blogspot.com.ar/2007/02/domain-driven-design-inject.html http://debasishg.blogspot.com.ar/2007/02/domain-driven-design-inject.html
- http://warren.mayocchi.com/2006/07/27/repository-or-dao/ http://warren.mayocchi.com/2006/07/27/repository-or-dao/
- http://www.sapiensworks.com/blog/post/2012/11/01/Repository-vs-DAO.aspx http://www.sapiensworks.com/blog/post/2012/11/01/Repository-vs-DAO.aspx
- DAO 和 Repository 模式有什么区别? https://stackoverflow.com/questions/8550124/what-is-the-difference-between-dao-and-repository-patterns
正如您所说,存储库是一个抽象概念。它们源自马丁·福勒的对象查询模式 http://martinfowler.com/eaaCatalog/queryObject.html。存储库和 DTO 都可以通过将持久数据映射到实体对象的等效集合来简化数据库持久性。然而,存储库比 DAO 更粗粒度,可以提供对整个系统的控制。聚合根 (AG) https://stackoverflow.com/questions/1958621/whats-an-aggregate-root通常向客户端隐藏大量内部状态。另一方面,DAO 可以像专用于单个实体对象一样细粒度。对于存储库和 DAO 来说,通常使用休眠 http://hibernate.org/或其他对象/关系映射 (ORM) 框架,而不是编写您自己的实现。
通常,服务可以驻留在服务层中,并且可以充当功能外观、反腐败层以及缓存和事务的协调器。它们通常是进行日志记录的好地方。服务粗粒度且面向用例,例如Service.updateCustomerAdress()
or Service.sendOrder()
。存储库可能太细粒度,客户无法使用,例如Customer.add(…)
, Order.modify(…)
.
存储库和 DAO 具有相同的目的 - 永久保存数据。另一方面,服务应该不知道持久性,也不了解您的数据库。它们通常与领域服务、存储库、领域核心紧密合作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)