DDD 中哪一层应该包含查询

2024-03-12

我有一个简单的 DDD 服务,带有文章聚合根。我使用 MediatR 和 CQRS 来分离命令和查询。在 DDD 域中不应依赖于应用程序和基础设施层。我有一个存储库 IArticleRepository,用于从文章数据库中组合一些数据。我有一个休息端点,用于通过某种过滤器获取文章,以便我创建

ArticleQuery : IRequest<ArticleDto(or Article)>

那么这个查询对象应该是什么时候呢?我每个聚合都有一个存储库,因此在域层中我有 IArticleRepository。我需要指定输入参数类型。如果我将查询放在基础设施或应用程序层中,我会获得从域指向基础设施或应用程序的依赖关系。如果我将查询放在域中,则会违反 DDD,因为查询与业务无关。如果我不将对象放入存储库,而仅将字段作为参数放入存储库,则会有大约 10-15 个参数 - 这是代码味道。

它需要,因为在查询处理程序中也出现了搜索引擎逻辑,所以我决定通过存储库或类似的东西将搜索引擎逻辑中的 SQL 逻辑封装在基础设施中。


我通常会去查询层各种各样的。就像我会有一个ICustomerRepository处理我的聚合我会有一个ICustomerQuery直接与我的数据存储交互。

存储库实际上应该仅用于聚合,因此仅用于数据修改。唯一的检索应该是检索整个聚合,以便对该聚合产生某种形式的更改。

查询层(更关心的是layer,真的)是基础设施。我通常也命名空间any读取模型 in a Query命名空间以区分我的域Customer,说,还有我的Query.Customer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DDD 中哪一层应该包含查询 的相关文章

  • 将 git 存储库向下移动到层次结构级别

    我现在已经搜索了几个小时 但找不到令人满意的答案 尽管这似乎是一个简单的新手问题 我基本上想要完成的是将当前位于项目文件夹旁边的 git 目录移动到项目文件夹中 最好这根本不应该改变存储库历史记录 尽管我不知道这实际上是否可能 我想这样做的
  • 恢复域对象的最佳方法

    这是一个如此简单而常见的场景 我想知道到目前为止我是如何做到的以及为什么现在遇到问题 我有这个对象 基础设施程序集的一部分 public class Queue public class QueueItem public QueueItem
  • Debiansources.list.d 与sources.list

    简单的问题 我在谷歌搜索时还没有找到解释 相对于sources list sources list d 的用途是什么 什么是d代表 我知道sources list包含debian可以下载软件的存储库的链接 虽然谷歌可以找到大量信息 但您不需
  • 领域驱动设计和安全

    这与此相关question https stackoverflow com questions 3006808 security implementation in domain driven design这似乎是不久前问过的 项目中的安全
  • 具有行为和 ORM 的丰富域模型

    观看 Jimmy Bogard 的 NDC12 演示 Crafting Wicked Domain Models 后 http ndcoslo oktaset com Agenda http ndcoslo oktaset com Agen
  • 通过 MediatR PipelineBehavior 进行单元测试验证

    我正在使用 FluentValidation 和 MediatR PipelineBehavior 来验证 CQRS 请求 我应该如何在单元测试中测试这种行为 Use the 测试扩展 https docs fluentvalidation
  • 如何将存储库注入到工作单元?

    我已经实现了我的 UnitOfWork 以便它保留对所有存储库的引用 public interface IUnitOfWork void Commit void RollBack public interface IMyUnitOfWork
  • 如何阻止 Maven 尝试访问 http://repo.maven.apache.org?

    开发机无法上网 大约60秒超时 当我尝试构建时 我看到 Downloading http repo maven apache org maven2 com google gsa connector 2 8 0 gsa connector 2
  • 领域驱动设计和聚合参考

    我正在设计领域模型 但有些东西似乎不太好 我从一个主要的聚合开始 它引用了其他聚合 而其他聚合也引用了更多聚合 我可以从主聚合开始遍历孔域模型 我看到的问题是我将在内存中保存聚合的所有实例 这是一个好的设计吗 我可以通过延迟加载解决内存问题
  • 将 Mercurial 存储库转换为 svn 存储库

    我知道你可以将 svn 存储库转换为 Mercurial 存储库 或使用 Mercurial 作为 svn 存储库的客户端 但我想要的是将 Mercurial 存储库转换为 svn 存储库 我们有一些使用 SVNKit 的工具 我们想继续使
  • 适用于 Windows 的 SVN 挂钩

    我用谷歌搜索了一下 发现确实没有适用于 Windows 的 SVN hooks 资源 所以我想我应该在这里创建一个维基来集中它 如果您贡献 请务必注明 钩子的名称 脚本的作用 实际脚本 注意 我怀疑发布史诗般的脚本不会有用 防止提交空注释
  • 如何从存储库中删除 Sonatype Nexus OSS(3) 组件

    这是我的第一个问题 我尽力做到最好 如果有什么问题 请简单地告诉我 我会纠正自己 我是 Sonatypes Nexus 3 OSS 的新手 我找不到从我的存储库中删除组件的方法 我的存储库中的一个包已变得无用 现在我想将其删除 我已经删除了
  • 是否可以从一个存储库中拉取并推送到另一个存储库?

    我在 github 上有一个公开的存储库 在那里我有一个正在开发的开源应用程序 用于制作产品目录和小型 cms 内容 我还有一个私有存储库 未托管在 github 中 它是在 github 中托管的开源应用程序下开发的应用程序 由于我目前正
  • Github 下载文件夹为 zip

    如何为我的 Github 存储库的访问者提供一个链接 以将我的存储库的 builds 文件夹下载为 zip 文件 该文件夹包含应用程序所需的可执行文件 着色器和纹理 当然 我可以手动构建该目录的 zip 文件并将其添加到存储库中 但这会导致
  • 如何将svn文件夹上一级

    我需要将 svn 文件夹移至上一级并保留所有历史记录 所有文件和目录来自https myserver com svn Project trunk into https myserver svn Project 我使用一个命令 svn mov
  • 命令调度程序和中介器设计模式有什么区别?

    最近 我了解了命令调度程序模式 它可以帮助将命令与我们基于域驱动设计方法和 CQRS 模式的项目中的命令处理程序解耦 不管怎样 我把它与中介者设计模式混淆了 罗伯特 哈维已经回答了 https softwareengineering sta
  • 使用组合来表示“is – a”关系时出现的问题

    我正在为人力资源系统开发系统 有会计员工和程序员员工 加入公司的第一个月 员工没有被赋予任何角色 一名员工可以同时担任会计师和程序员 我有一个由以下代码所示的设计 现在 我需要通过实现新功能来增强系统 解雇所有会计师 终止意味着将员工的状态
  • 使用流程管理器(又名 saga)在同一有界上下文中跨聚合根实现最终一致性

    假设您的有界上下文中有两个聚合 它们之间存在一些约束 使用 DDD 这些内部聚合约束不能在同一事务中强制执行 即聚合边界是事务边界 您是否会考虑使用 Microsoft CQRS 旅程中所谓的 流程管理器 来协调同一有界上下文中的两个聚合
  • 无法在 Junit 测试中自动装配 JpaRepository - Spring boot 应用程序

    Hi All 我正在尝试在 Spring boot 应用程序中执行 Junit 测试 Junit 应该测试一些 CRUD 操作 我正在使用 Spring Repositories 特别是 JpaRepository 存储库类 package
  • 存储库和服务层之间的区别

    我查看了一些相关的问题 但仍然没有看到存储库和服务层之间有太大区别 所以给出的例子我想它应该看起来像这样 如果不是请告诉我为什么 public interface ProductRepository extends CrudReposito

随机推荐

  • 如何将属性 getter 作为函数类型传递给另一个函数

    如何将属性 getter 传递给接受函数类型的函数 这是我想要实现的目标的示例 class Test val test String get lol fun testFun func gt String invoke it here fun
  • 由于 sqlite3 gem 错误,Heroku 部署失败

    我刚刚开始阅读 Michael Hartl 所著的 ruby railstutorial org 书籍 并且已经完成了第一章 我正在使用 mac book OS X Terminal 和 Sublime Text 一切都按计划进行 直到测试
  • R在sqldf中调用变量

    我需要对 sqldf 语句进行循环 为此我需要在 sqldf 代码中调用循环变量 我的表 数据 可能是 data lt read table text loaddate DaysRange DaysRangeNext 1 2014 03 1
  • 我对并发 MySQL 连接感到困惑

    所以 我读了一本关于Mysql的书 它说可以访问数据库的并发用户数是有限制的 这是否意味着如果我有 20k 用户同时浏览我的 Web 应用程序 我的 Web 应用程序将无法加载数据库中的数据 因为每次我的网站加载时 我的网络应用程序都会访问
  • FutureWarning:如果 dtype='numeric',则字节/字符串数组将转换为十进制数字

    FutureWarning Arrays of bytes strings is being converted to decimal numbers if dtype numeric This behavior is deprecated
  • 截断内存映射文件

    我正在对索引文件使用内存映射 IO 但问题是如果文件大部分为空 我无法调整文件大小 之前的某个地方 MappedByteBuffer map raf getChannel map MapMode READ WRITE 0 1 lt lt 3
  • 使用 BeautifulSoup python 3.6 抓取数据时网页值丢失

    我正在使用下面的脚本来删除 股票报价 数据http fortune com fortune500 xcel energy http fortune com fortune500 xcel energy 但其给出空白 我也使用过硒驱动程序 但
  • 从十六进制 istream 中读取双精度值

    Given double foo我可以使用十六进制格式字符串分配它sscanf像这样 sscanf 0XD lg foo 但我似乎无法得到istringstream以同样的方式行事 所有这些都只需写入 0 即可foo istringstre
  • 哈斯克尔范围 (GHCi)

    我正在阅读为你学习 Haskell 以造福人类 http learnyouahaskell com 他的例子 http learnyouahaskell com starting out texas ranges 2 2 20 and 3
  • 逻辑或在doctrine2 getRepository->findBy()

    如何像doctrine2中那样编写查询 SELECT from table where field value1 or field value2 我发现了类似的东西 em gt getRepository myentitity gt fin
  • 从 Selenium WebDriver 中的 WebElement 获取 CSS 选择器字符串 - Java

    我有一个 WebElement 我只是想提取 CSS 选择器字符串 这是我调试代码时变量的值 ChromeDriver MAC 上的 chrome 345345345n5435345b34 gt css 选择器 div class 警报警报
  • UICollectionView 自动调整大小和动态行数

    我正在尝试做这样的事情 Basically I am using a UICollectionView and the cells 3 diferent xib 到目前为止 它有效 我想做的事情是 Set a autoheight 如果旋转
  • 使用c#泛型继承,而类类型是继承的

    在 C 中可能有这样的事情吗 假设我有这个 public class T U 我想要这个 public class A
  • scipy linregress 函数错误的标准错误返回?

    我遇到了一个奇怪的情况 scipy stats linregress 似乎返回了不正确的标准错误 from scipy import stats x 5 05 6 75 3 21 2 66 y 1 65 26 5 5 93 7 96 gra
  • mergeMap 和 mergeMapTo 有什么区别?

    在 rxjs5 文档中 它提到 为了减少多态性并从运算符中获得更好的性能 一些运算符已被拆分为多个运算符 它的实际含义是什么以及如何使用 mergeMapTo 运算符 来自docs http reactivex io rxjs class
  • 如何更改 Rust 字符串中特定索引处的字符?

    我正在尝试更改字符串中特定索引处的单个字符 但我不知道如何更改 例如 我如何将 hello world 中的第四个字符更改为 x 以便它成为 helxo world 最简单的方法是使用replace range https doc rust
  • 让模型监听嵌套模型和集合的最佳模式?

    使用 Backbone js 让模型监听所有嵌套模型和集合的最佳模式是什么 我应该将嵌套模型 集合放入属性中吗 我应该手动创建亲子关系并触发事件吗 与 Backbone js 的大多数事情一样 您不会得到 正确 的答案 但我可以分享我是如何
  • 在一定规则下动态创建数组

    我需要创建具有遵循这些模式的某些值 属性的数组 不幸的是 我的数学知识不允许我找到规律 以下是应在 从下到上 n 1 2 和 3 处输出的数组示例 计算每条边上的红色框 所有红色和绿色方块都应该分配一些值 而所有白色方块都需要未定义 或空
  • 参数里面的冒号是什么意思? [复制]

    这个问题在这里已经有答案了 words pron dict str 上的冒号是什么意思 我在 python 2 7 上遇到语法错误 是Python 3吗 我该如何使用它 class TextToSpeech CHUNK 1024 def i
  • DDD 中哪一层应该包含查询

    我有一个简单的 DDD 服务 带有文章聚合根 我使用 MediatR 和 CQRS 来分离命令和查询 在 DDD 域中不应依赖于应用程序和基础设施层 我有一个存储库 IArticleRepository 用于从文章数据库中组合一些数据 我有