Vic*_*tor 32 dao domain-driven-design repository
在阅读了几篇文章后,我开始理解DAO和存储库之间的区别,但我发现自己在试图理解存储库和服务之间的区别时遇到了麻烦.
对于短期而言,在OO范例中:
DAO:包含CRUD operations一个实体类的基本类的类.它具有获取或检索底层持久存储系统的必要代码.一般而言,除了retrieve使用标识符类型有效的方法之外,方法接收对象实体作为参数.
存储库:在更高级别的抽象中......通常我读过的是一种放置代码来处理聚合对象(具有子对象的对象)的操作的地方.它使用DAOs从数据库中检索对象,最后它以域"业务"语言公开接口.(但同样,我认为使用ID的数据类型是非常有效的).示例:一个非常简单的addSomething地方something是父实例的子对象,其实例btw由存储库作为整体进行管理.
服务:同样,它处于更高的抽象层次.从我不起眼的角度来看,它们是连接两个不共享父子关系的类的好地方,但与存储库一样(在抽象术语中).示例:transferCash两者之间的方法bank accounts.
所以,这是我的读物,但我在这里问上述想法是对还是不对.或者我应该如何思考.或者让我真正了解所有这些概念的不同之处.
一些来源:
Mag*_*eus 24
存储库 - 就像你说的 - 是一种抽象.它们源于Martin Fowler的对象查询模式.存储库和DTO都可以通过将持久化数据映射到等效的实体对象集合来简化数据库持久性.但是,通过提供对整个聚合根(AG)的控制,存储库通常比客户端隐藏了大量内部状态,因此存储库比DAO更粗粒度.另一方面,DAO可以像专用于单个实体对象一样精细.对于存储库和DAO,通常使用Hibernate或其他对象/关系映射(ORM)框架而不是编写自己的实现.
通常,服务可以驻留在服务层中,并且可以充当功能外观,反腐败层和协调器,用于缓存和事务.它们通常是进行伐木的好地方.服务粗粒度和面向用例,例如Service.updateCustomerAdress()或Service.sendOrder().例如Customer.add(…),存储库对于客户来说可能过于细粒度Order.modify(…).
存储库和DAO具有相同的目的 - 永久保存数据.另一方面,服务应该不知道持久性并且不了解您的数据库.它们通常与域服务,存储库,域核心紧密配合.
小智 14
存储库是用于存储和检索聚合根(AR)的接口,而不是单个实体.您的域模型的每个AR都有一个存储库.
根据Fowler的Repository Pattern,存储库就像内存中的对象集合一样,这是将它们与DAO进行比较的主要区别之一.
存储库接口是域模型客户端(因此是域模型的一部分)的一种手段,可以开始使用域模型.客户端旨在从存储库获取AR实例,在其上调用一些方法,通常会修改其内部状态,然后将其存储回存储库.