Domain driven design DDD中的DAO、存储库和服务
在阅读了几篇文章之后,我开始理解DAO和存储库之间的区别,但我发现自己在理解存储库和服务之间的区别时遇到了麻烦 简而言之,在OO范例中:Domain driven design DDD中的DAO、存储库和服务,domain-driven-design,dao,repository,Domain Driven Design,Dao,Repository,在阅读了几篇文章之后,我开始理解DAO和存储库之间的区别,但我发现自己在理解存储库和服务之间的区别时遇到了麻烦 简而言之,在OO范例中: DAO:包含一个实体类的基本CRUD操作的类。它有必要的代码来获取或检索底层持久存储系统的内容。一般来说,这些方法接收对象实体作为参数,除了在检索方法中使用一种类型的标识符是有效的 存储库:处于更高的抽象级别。。一般来说,我读过的是一种放置处理聚合对象(具有子对象的对象)上的操作的代码的地方。它使用DAOs从数据库中检索对象,最后用域“业务”语言公开一个接口
- DAO:包含一个实体类的基本
CRUD操作的类。它有必要的代码来获取或检索底层持久存储系统的内容。一般来说,这些方法接收对象实体作为参数,除了在
方法中使用一种类型的标识符是有效的检索
- 存储库:处于更高的抽象级别。。一般来说,我读过的是一种放置处理聚合对象(具有子对象的对象)上的操作的代码的地方。它使用
s从数据库中检索对象,最后用域“业务”语言公开一个接口。(不过,我认为使用ID的数据类型是非常有效的)。示例:一个非常简单的DAO
,其中addSomething
是父对象的子对象,顺便说一句,其实例由存储库作为一个整体进行管理something
- 服务:同样,它处于更高的抽象级别。在我看来,它们是连接两个不共享父子关系,但(从抽象的角度)与存储库一样远的类的好地方。示例:在两个
银行账户之间
转账现金的方法
Service.updateCustomerAddress()
或Service.sendOrder()
。存储库的粒度可能太细,客户端无法使用,例如,Customer.add(…)
,Order.modify(…)
存储库和DAO有着相同的目的——永久保存数据。另一方面,服务应该不知道持久性,也不知道您的数据库。它们通常与域服务、存储库、域核心紧密合作。我甚至不确定“DAO”是什么。存储库是用于加载实体的抽象。您应该能够获取一个实体并保存一个,就是它。没有疑问。如果您想查询一些数据,可以编写一个查询(甚至可以在MVC操作方法中,或者使用最简单的简单抽象,允许执行一些SQL,返回一些可以直接呈现到HTML中的DTO)
另一方面,服务是棘手的。首先,这个术语被重载了。“应用程序服务”是由exist定义的,因为域模型中的对象不允许访问数据库、消息传递、缓存等基础设施问题。它们需要为它们完成所有这些工作,并将这些工作交给它们,而应用程序服务正是这样做的。应用程序服务本身不包含任何逻辑。我不希望看到icCustomerService.ChangeAddress()
执行以下操作以外的任何操作:
Customer.ChangeAddress(newAddress)
存储库是用于存储和检索的接口,而不是单个实体。您的域模型的每个AR都有一个存储库。根据Fowler的说法,存储库的行为类似于内存中的对象集合,这是将它们与DAO进行比较的主要区别之一
存储库接口是域模型的客户端(因此是域模型的一部分)开始使用域模型的一种方法。客户机的目的是从存储库中获取AR实例,对其调用一些方法,这些方法通常会修改其内部状态,然后将其存储回存储库。
您读过或吗?没有什么能比得上从源头获取知识……不,我还没有,我没有太多时间。嗯,我很快读到了一些关于DDD的内容,但我觉得我需要更多的时间。。。是的,我知道。谢谢Magnus,我想看看存储库和服务的完整方法签名,以便理解抽象的想法。顺便说一句,关于DAO,它应该是好的。看看,否则你会发现存储库和服务。。只要启动visual studio解决方案并搜索“存储库”和“服务”,您就会找到很多。经过很长时间,我已经回顾了这个主题,我认为这应该是正确的答案。谢谢你们抽出时间!你们所有人!我感兴趣的是,如果服务“可以驻留……用于缓存和事务”,那么“另一方面,服务应该不知道持久性”。事务不是持久性的一部分吗?@Sabine-true。他们不应该知道持久性或缓存。但是,诸如日志记录、安全性、事务、某种验证等横切关注点通常在se中功能和操作