DDD 中的 DAO、存储库和服务

2023-12-29

阅读了几篇文章后,我开始理解 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(使用前将#替换为@)

DDD 中的 DAO、存储库和服务 的相关文章

随机推荐

  • C++ 中的静态可变成员变量?

    为什么或出于什么原因不可能在 C 中将类成员变量声明为static mutable 就像是 static mutable int t This won t compile 对我来说 没有理由禁止这样的声明 例如 出于维护全局类范围统计数据等
  • 使用 selenium C# 在文本字段上执行键盘敲击“Ctrl + A”、“Ctrl + C”和“Ctrl + V”

    How to simply want to input a value in a text box select the complete text from the text box using Ctrl a then copy it u
  • Linux 上共享对象 (.so) 的异常

    我有一个名为 ftest 的测试程序 它加载包含测试的 so 文件并运行在其中找到的测试 其中一项测试加载并运行一个 so 其中包含用于我们的 O RM 的 Postgres 数据库驱动程序 当 Postgres 驱动程序抛出该 so 文件
  • 从 Azure Functions 连接到 WCF 服务并对程序集绑定进行故障排除

    在哪里可以看到 Azure 函数尝试加载的程序集 就像Windows上的fuslogvw Update按要求更新标题以更好地反映已接受的答案 Update 将我的代码更改为使用 WebClient 手动 构造 SOAP 请求并且它可以工作
  • 准备好的语句、hibernate 和 HQL

    当将 HQL 转换为 SQL 时 Hibernate 在内部使用 JDBC 下的PreparedStatements HQL 中的内联参数是如何处理的 example public List
  • hive中分区和索引的区别

    我是 hadoop 和 hive 的新手 我会知道 hive中索引和分区有什么区别 什么时候使用索引 什么时候分区 谢谢你 索引是新的并且正在不断发展 正在添加功能 但目前索引仅限于单个表 并且不能与外部表一起使用 创建索引会创建一个单独的
  • WebHttpBinding 与 Http 和 Https

    我正在尝试在网站上使用 https 和 http 该网站具有充当 REST 服务并从 JavaScript 调用的 svc 文件 我的配置
  • 如何创建Facebook风格的“点赞”系统?

    我一直试图在网上找到 Facebook 风格的 点赞 按钮的示例 但一直找不到类似的东西 我想做的是 在用户可以按下的图像下方放置一个按钮 一旦按下 它将增加数据库中图像记录的值 然后通过在现有数量上添加 1 来反映页面上的添加 我猜这需要
  • 什么取代了 JINI?

    看来JINI还不错一个废弃的项目 https stackoverflow com questions 44824 is jini at all active anymoreJini org 网站的最新版本是去年的 此后就没有任何消息了 JI
  • urllib.error.HTTPError:HTTP 错误 429:请求过多

    直到上周我才能够使用pythonsmopy包裹https pypi org project smopy https pypi org project smopy 显示从 openstreetmap 获取的地图图块https www open
  • 忽略大小写和特殊字符,在两列中查找可能的重复项

    Query SELECT COUNT name number FROM tbl GROUP BY name number HAVING COUNT gt 1 有时无法找到小写和大写之间的重复项 E g sunny and Sunny不要显示
  • iOS 中 UIImageView 的圆形蒙版动画

    我想知道如何在 uiimageview 上对蒙版的比例进行动画处理 附示例图片 灰色框是我的 uiviewcontroller 的图像背景 不是问题的一部分 我假设创建一个 uiview 子类 并传递图像 半径和中心点 然后 创建一个蒙版
  • 在线 Javascript 代码评估工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Adobe AIR 应用程序在空闲时间后响应缓慢

    我花了数百美元使用 Flex 4 0 开发 Adob e AIR 应用程序 现在我想我应该已经完成 了 但在让应用程序运行几个小时以上后 UI 响应能力开始缺乏 我做什么 我的应用程序通过将具有透明度的背景图像设置为窗口模块中的 Borde
  • 线程安全的梅森扭曲器

    在寻找线程安全的随机生成器时 我发现了一个 mersenne twinser 生成器类 作者说如果线程安全的话 http www umiacs umd edu yangcj mtrnd html http www umiacs umd ed
  • keras 中的 One-hot 编码标签

    我有一组来自 CSV 文件中标签列的整数 1 2 4 3 5 2 班级数量为5即范围1 to 6 我想使用下面的代码对它们进行一次性编码 y df iloc 10 values y tf keras utils to categorical
  • Chrome网络计时,如何改进内容下载

    我在 Chrome DevTools 中检查 XHR 调用计时以改善缓慢的请求 但我发现 99 的响应时间都浪费在内容下载上 即使内容大小小于 5 KB 并且应用程序在本地主机上运行 正在工作 我的本地机器 所以没有网络问题 但是 当使用
  • wp_remote_post 响应正文受到保护

    我已经进行了 API 调用wp remote post并试图用wp remote retrieve body 但响应仅显示标头 正文受到保护 下面的代码 我用来进行 API 调用 args array LocationId gt loc i
  • Handlebars.js:像普通完整模板一样使用部分模板

    我有一个模板 我想将其用作部分模板 并通过 javascript 单独使用 如果您的模板是预编译的 您可以通过以下方式访问您的部分模板Handlebars partials partial name 以及通过模板从模板调用它们 gt par
  • DDD 中的 DAO、存储库和服务

    阅读了几篇文章后 我开始理解 DAO 和存储库之间的区别 但我发现自己在尝试理解存储库和服务之间的区别时遇到了麻烦 简而言之 在 OO 范式中 DAO 包含基本的类CRUD operations对于一个实体类 它具有获取或检索底层持久存储系