应用程序、域和基础设施层 (DDD) 中的存储库实现

2023-12-06

我有一个这样的项目结构:

enter image description here

Here, IApplicationDbContext.cs接口定义在Application层及其实现是在Infrastructure层。类似地,对于名为“IRepository”的通用存储库

我对在哪里实施特定存储库有疑问?在这种情况下,我有IProductRepository定义在Application层。那么,我应该在哪里实现这个功能呢?在里面Application Layer本身?或在Infrastructure Layer?

请指导。


存储库实施
The Infrastructural Layer应用程序的外观代表使其能够运行的技术细节。它负责存储域对象状态信息的技术实现。
So the Repository implementation属于Infrastructure Layer因为他们处理存储,这不是责任 该模型应该采用。它通常由持久性框架支持来完成繁重的工作。特定存储库必须在Infrastructure Layer.

存储库合约
根据DDDRepository contract应定义在Domain Layer所有域对象旁边。高层模块不应该依赖于低层模块。两者都应该依赖于抽象。抽象不应该依赖于细节。细节应该取决于抽象。基于这个规则,我们不能定义存储库接口Infrastructure layer。存储库也可以用于Domain Layer在这种情况下,我们不能定义合同Application Layer。 存储库是领域模型和持久性之间的契约。它应该只根据域来编写,而不考虑底层的持久性。存储库的契约不仅仅是一个 CRUD 接口。它是领域模型的扩展,并以领域专家理解的术语编写。您的存储库应该根据应用程序用例的需求构建,而不是从类似 CRUD 的数据访问角度构建。
在分层架构中哪里定义存储库的接口?
领域驱动设计实施指南

存储库客户端
一个典型的客户Repository is the Application Service Layer.
Domain Services也可以使用存储库。

enter image description here enter image description here

参考:
Vaughn Vernon - 实施领域驱动设计
领域驱动设计的模式、原则和实践第一版 通过斯科特·米利特

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

应用程序、域和基础设施层 (DDD) 中的存储库实现 的相关文章

  • 导入数据和事件溯源

    我目前正在开发一个整体系统 我希望将其引入现代并结合 DDD 和 CQRS 我收到了重新编写解决方案的导入机制的请求 并认为这可能是开始此重新架构过程的好机会 目前流程是 用户上传 CSV 系统解析 CSV 并在屏幕上显示每一行 对每一行以
  • 存储库和工作单元模式 - 如何保存更改

    尽管此类问题被问了很多次 但我仍在努力理解存储库和工作单元模式之间的关系 本质上我仍然不明白哪一部分将保存 提交数据更改 存储库还是工作单元 由于我见过的每个示例都与将它们与数据库 或映射器结合使用有关 让我们制作一个更有趣的示例 让我们将
  • 如何在领域层使用工作单元

    我正在尝试在 我的服务 类中使用工作单元模式 我有我的 CompanyService 课程 public class CompanyService ICompanyService private readonly ICompanyRepos
  • 是否有在基于 DDD 的分层架构中的模型层和数据访问层之间使用 LINQ 的建议模式

    我一直在读蒂姆 麦卡锡的书关于 NET 中的 DDD 的精彩书籍 http www amazon co uk NET Domain Driven Design Solution Programmer dp 0470147563 但在他的示例
  • CQRS 对于我的域是否正确?

    我正在对一个档案进行建模 它是视频点播系统的一部分 将存档想象成 Windows 资源管理器 其中多个用户可以创建文件夹 上传视频 重组文件夹等 有业务规则 权限 确定是否允许用户执行任务 即重命名文件夹 移动文件夹 查看文件夹等 我已将每
  • 实体框架:获取存储库中的子类对象

    我有与下面列出的数据库表对应的以下模型 经理就是雇员 会计师也是雇员 让所有管理器都进入存储库的最佳方法是什么 如何实现GetAllManagers 方法 这是正确的TPT吗 CODE MyRepository MyEmployeeRepo
  • 实体框架中的聚合根支持

    我们如何告诉实体框架骨料 http domaindrivendesign org node 88 保存聚合时 保存聚合内的实体 删除聚合时 删除聚合内的实体 当两个不同的用户尝试修改同一聚合中的两个不同实体时引发并发错误 加载聚合时 即使在
  • 有丰富的领域模型示例吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个简单的示例来说明使用富域模型的好处 理想情况下 我想要一个之前和之后的代码列表 应该尽可能
  • DDD 聚合和值对象

    我想问一下关于DDD功能的问题 假设我们有两个聚合 每个聚合都包含值对象地址 根据 Eric Evans DDD 我们应该将聚合彼此隔离 因此第一个聚合的聚合根不能有指向 Address 的链接 坦白说 这对我来说似乎没有意义 所以问题是如
  • 领域模型可以知道存储库吗?

    可能对于某些域逻辑实现实体需要访问存储库以更新 删除自身或任何相关实体 这听起来对吗 不 不是 至少对于标有 的问题 领域驱动设计 标签 当然 Active Record 模式有权在某些系统中生存 并且有些人发现强耦合很有用 但在 DDD
  • DDD:持久聚合

    让我们考虑一下典型的Order and 订单项目例子 假如说订单项目是的一部分Order聚合 只能通过订单添加 所以 要添加一个新的订单项目 to an Order 我们必须通过存储库加载整个聚合 将新项目添加到Order对象并再次保留整个
  • 寻找领域事件的例子

    有谁知道在哪里可以找到域事件实现的示例代码 如乌迪 达汉 http www udidahan com in 领域事件 救赎 http www udidahan com 2009 06 14 domain events salvation 在
  • linq2sql,存储库模式 - 如何从两个或多个表查询数据?

    我使用存储库模式 和 linq2sql 作为数据访问 并拥有例如 ProductsRep 和 CustomersRep 在非常简单的场景中 数据库有两个表 产品 产品 ID 客户 ID 产品名称 日期 和顾客 客户 ID 名字 姓氏 每个存
  • 如何将当前用户信息传递到 DDD 中的所有层

    类似的问题以前曾被问过 但不完全相同 除非我错过了 我想通过我的服务 域 域事件 域事件处理程序传递 IUserInfo 类实例 什么是最好的方法 我是不是该 通过注册使用 IoC 注入它 针对 Httpcontext Current se
  • 对聚合根内实体的操作

    如果我设计了如下所示的 AR 您认为我应该如何更新订单行对象之一中的属性 例如 我如何更改订单行之一的标题 示例问题 这是订单聚合根 public class Order private readonly int id private re
  • CQRS - 何时发送确认消息?

    Example 业务规则规定 客户下订单后应收到确认消息 电子邮件或类似消息 可以说 一个NewOrderRegisteredEvent从域调度并由发送确认消息的事件侦听器拾取 完成此操作后 其他一些事件处理程序会引发异常或出现其他问题 并
  • 如何在此 MSDN 示例中使用 Order By

    我正在尝试弄清楚如何使用这个 orderBy 参数 我不确定我应该传递什么 http www asp net mvc tutorials getting started with ef using mvc implementing the
  • NHibernate IQueryable 集合作为 root 的属性

    我有一个根对象 它有一个集合属性 例如 I have a Shelf object that has Books Now public class Shelf public ICollection
  • 关于存储库的领域驱动设计问题

    我正在尝试实现 DDD 因此我创建了以下类 用户 域模型 UserRepository 管理对象的中央工厂 UserMapper UserDbTable 映射应用程序功能并提供 CRUD 实现的映射器 我的第一个问题是 当模型需要与持久层通
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或

随机推荐

  • jQuery Live 可以在 Safari 上运行吗?

    我刚刚问过这个问题一小时前但对于 IE8 我被告知 JQuery Live 处理程序不支持 更改 所以我切换到 单击 这解决了我的问题 现在我发现 Safari 由于某些奇怪的原因无法使用单击 有人知道吗为什么 所以我在想我可以两者兼得吗
  • gdb:没有可用的瓶子-gdb 安装

    我尝试在我的 M1 Mac OS 11 5 2 上安装 gdb 命令 但出现了 brew 错误 gdb 没有可用的瓶子 I use brew install gdb 这是输出 Error gdb no bottle available Yo
  • 我怎样才能给eclipse更多的内存超过512M?

    我有以下设置 但是当我输入 1024 并将所有 512 替换为 1024 时 Eclipse 根本不会启动 我的 eclipse JVM 如何拥有超过 512M 的内存 startup plugins org eclipse equinox
  • 如何开发“旋转瓶子”应用程序

    我正在制作一个旋转瓶子游戏 我不知道如何通过滑动手指的速度来控制瓶子的旋转速度 我希望它像命运之轮一样工作 你刷得越快 它转得越快 我开始开发UIRotationGestureRecognizer 但我真的不认为这是最好的方法 嘿检查这个演
  • 无法读取 jar 文件中的文件

    我使用 spring boot 开发了一个应用程序 我需要读取包含电子邮件的 csv 文件 这是我的做法的一个片段 public Set
  • 如何在MySQL视图中生成序列号?

    我在Linux下使用MySQL 5 6 我有一个表可以让用户输入发件人号码和收件人号码 然后 有一个视图可以从另一个表中选择一些帐号在发件人号码和收件人号码之间的记录 最困难的问题是用户希望视图中的每条记录都有一个从 1 开始的序列号 例如
  • 有什么理由使用 css box-shadow 而不是 drop-shadow 吗?

    假设客户端兼容 是否有任何情况CSSbox shadow优于filter drop shadow From 文章这好像是drop shadow是硬件加速超集box shadow 这意味着我们基本上应该始终使用drop shadow代替box
  • C# 可以通过管道传输吗?

    我正在尝试使用 TCP 和简单的文本命令来控制网络上的程序 我最终可能会切换到二进制数据 但是 我想知道是否有一种方法可以对程序发送的数据进行编码并通过网络发送 然后对其进行解码并将其提供给接收程序 我当前的代码如下 但我正在尝试找到一种比
  • 比较时间戳与日期变量(MySQL 和 PHP)

    非常感谢任何帮助 假设我有一个 MySQL 数据库 其中时间戳列的值为 1305590400 我如何将其与 PHP 变量 2011 05 17 进行比较 我想完全忽略时间部分 只比较日期 目前我正在尝试让它与以下内容一起工作 但它没有返回结
  • Win32 CRITICAL_SECTION 包含什么?

    Win32 CRITICAL SECTION 包含哪些数据 它有多大 这是没有记录的 大概是特定于实现的 但我很想知道 这是我安装的 Windows Vista SDK 的结果 WinNT h typedef struct RTL CRIT
  • 将 wsHttpBinding 转换为 customBinding

    如何将以下 wsHttpBinding 转换为 customBinding 我需要这样做 这样我就可以增加时钟偏差 这是针对http的
  • 如何获取Windows负载值[重复]

    这个问题在这里已经有答案了 我想使用 Java 从 Windows 获取有关 CPU RAM HDD 网络和进程 服务 列表的数据 如何在不使用第三方库或 JNI 的情况下获取这些系统值 Windows 中是否有类似于 proc 的东西 我
  • 如何绘制具有径向渐变的扇形(iphone)

    如何在 Objective c Core Graphics 中绘制具有径向渐变的扇形 实心圆弧 我用 CGContextDrawRadialGradient 但它画了圆圈 如果你告诉我如何通过径向渐变填充任何形状 那就太好了 谢谢 添加定义
  • 防止 WooCommerce 优惠券堆叠在购物车和结帐页面上

    我需要防止两个特定的优惠券一起使用 我成功地实现了这段代码 它可以防止将这些优惠券堆叠在cart page add action woocommerce before cart check coupon stack function che
  • 使用 json 序列化的 void 函数 swift 4 中出现意外的非 void 返回值

    我目前正在尝试通过编写可以多次使用的通用函数来清理项目上的代码 但是我需要我的函数返回一个数组 我的错误是 void 函数中出现意外的非 void 返回值 这是我的代码 func JSONSerialisation JsonUrl Stri
  • Mysql 空间索引未使用

    我正在寻找能够找到从点到点给出的近似匹配的行 假设在 20 米内 它可以工作 但它不使用索引 我试图利用该表上的空间索引 但似乎没有使用它 解释命令给我 possible keys null 具有以下内容 mysql 5 7 17 tabl
  • 如何在两个地方获取锁,但在一个地方释放锁?

    我是 C 新手 我需要在两种方法中获取锁定 但在一种方法中释放 那行得通吗 public void obtainLock Monitor Enter lockObj public void obtainReleaseLock lock lo
  • 改进并行计算的内存布局

    我正在尝试使用 C AMP 优化用于并行计算的算法 Lattice Boltzmann 并寻找一些优化内存布局的建议 刚刚发现将一个参数从结构中删除到另一个向量 阻塞向量 中可以增加约 10 有人有任何可以进一步改善这一点的建议 或者我应该
  • Android:按下“后退”按钮时提示用户保存更改

    我有一个包含多个用户可编辑项目 EditText 字段 RatingBar 等 的活动 如果按下后退 主页按钮并且已进行尚未保存的更改 我想提示用户 读完android文档后 似乎这段代码应该放在onPause方法中 我尝试在 onPaus
  • 应用程序、域和基础设施层 (DDD) 中的存储库实现

    我有一个这样的项目结构 Here IApplicationDbContext cs接口定义在Application层及其实现是在Infrastructure层 类似地 对于名为 IRepository 的通用存储库 我对在哪里实施特定存储库