Domain driven design DDD中的DAO、存储库和服务

Domain driven design DDD中的DAO、存储库和服务,domain-driven-design,dao,repository,Domain Driven Design,Dao,Repository,在阅读了几篇文章之后,我开始理解DAO和存储库之间的区别,但我发现自己在理解存储库和服务之间的区别时遇到了麻烦 简而言之,在OO范例中: DAO:包含一个实体类的基本CRUD操作的类。它有必要的代码来获取或检索底层持久存储系统的内容。一般来说,这些方法接收对象实体作为参数,除了在检索方法中使用一种类型的标识符是有效的 存储库:处于更高的抽象级别。。一般来说,我读过的是一种放置处理聚合对象(具有子对象的对象)上的操作的代码的地方。它使用DAOs从数据库中检索对象,最后用域“业务”语言公开一个接口

在阅读了几篇文章之后,我开始理解DAO和存储库之间的区别,但我发现自己在理解存储库和服务之间的区别时遇到了麻烦

简而言之,在OO范例中:

  • DAO:包含一个实体类的基本
    CRUD操作的类。它有必要的代码来获取或检索底层持久存储系统的内容。一般来说,这些方法接收对象实体作为参数,除了在
    检索
    方法中使用一种类型的标识符是有效的

  • 存储库:处于更高的抽象级别。。一般来说,我读过的是一种放置处理聚合对象(具有子对象的对象)上的操作的代码的地方。它使用
    DAO
    s从数据库中检索对象,最后用域“业务”语言公开一个接口。(不过,我认为使用ID的数据类型是非常有效的)。示例:一个非常简单的
    addSomething
    ,其中
    something
    是父对象的子对象,顺便说一句,其实例由存储库作为一个整体进行管理

  • 服务:同样,它处于更高的抽象级别。在我看来,它们是连接两个不共享父子关系,但(从抽象的角度)与存储库一样远的类的好地方。示例:在两个
    银行账户之间
    转账现金的方法

这就是我的阅读材料,但我想问的是,上面的想法是否正确。或者我该怎么想。或者是让我真正理解所有这些概念的区别

一些资料来源:


正如您所说,存储库是一种抽象。它们起源于马丁·福勒。存储库和DTO都可以通过将持久化数据映射到等效的实体对象集合来简化数据库持久化。然而,存储库比DAO更粗粒度,因为它提供了对整个系统的控制,并且常常对客户机隐藏大量内部状态。另一方面,DAO可以像专用于单个实体对象一样细粒度。对于存储库和DAO,通常使用或其他对象/关系映射(ORM)框架,而不是编写自己的实现

通常,服务可以驻留在服务层中,并且可以作为功能外观、反损坏层和缓存和事务的协调器。它们通常是进行伐木的好地方。服务粗粒度且面向用例,例如
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中功能和操作