问题标签 [ddd-repositories]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3567 浏览

domain-driven-design - DDD 如何获取值对象列表

我有一个域模型

  • Customer- 聚合根 - 因为没有客户,订单就无法存在
  • Order- 实体
  • OrderStatus- 价值对象

在我的表格中,我需要一个所有OrderStatuses.

我是否应该从包含所有 OrderStatuse 列表的空订单实体的存储库中获取空客户实体 (AR)?这很尴尬。

0 投票
1 回答
459 浏览

domain-driven-design - 如何确定聚合根

我有一个工程师访问气井的应用程序。他可以通过选择 7 个特征的任意组合来查看井列表。特征依次为公​​司、州、县、流域、分公司、领域、运营商。应用程序启动,我需要检索公司列表。用户看到的公司是基于他们的安全凭证。我的存储库基础的聚合根/域对象是什么。我首先想到的是用户,但我从未检索过有关用户的任何信息。这些项目和其他几个属性的组合统称为井口信息。那会是我的存储库的聚合根或域对象吗?

提前致谢

0 投票
2 回答
231 浏览

domain-driven-design - DDD 主题 - 课程关联 AggregateRoot

我是 DDD 的新手。我有一个主题实体和课程实体。主题有很多教训。我需要添加/删除主题以及课程。我应该为实体创建两个不同的存储库,还是只创建一个处理所有课程的 TopicRepository?这是一个经典的Order - OrderItem模型吗?

谢谢

0 投票
3 回答
1602 浏览

c# - 我应该如何在 C# 中实现我的存储库 (DDD) 以处理对同一聚合根的多个调用

我的项目中的哪个类应该负责跟踪已经创建了哪些聚合根,以免为同一个实体创建两个实例。我的存储库是否应该保留它创建的所有聚合的列表?如果是,我该怎么做?我是否使用单例存储库(对我来说听起来不对)?另一种选择是将这种“缓存”封装在其他地方是其他类吗?这个类会是什么样子,它适合什么模式?

我没有使用 O/R 映射器,所以如果有一种技术可以处理它,我需要知道它是如何做到的(如它使用的模式)才能使用它

谢谢!

0 投票
3 回答
811 浏览

domain-driven-design - DDD 中的存储库或 ServiceAgent

我有一个使用存储库与数据库对话的系统。当它是远程服务时,正确的定义是什么?或更好,

存储库用于数据库,因为 [...] 用于外部 Web 服务。

我在很多地方都找到了关于 ServiceAgents 的信息,但我不知道这是否是正确的定义。

0 投票
2 回答
1862 浏览

c# - 架构问题:Fluent NHibernate、存储库模式和 ASP.NET MVC

我刚刚开始了一个新项目,自然而然地选择使用很多新技术。

我正在使用(流利的)NHibernate、ASP.NET MVC 3 并尝试应用存储库模式。

我决定将我的业务逻辑分离到一个单独的项目中,并定义包装我的存储库的服务,以便我可以返回 POCO 而不是 NHibernate 代理,并在我的前端和 DA 逻辑之间保持更多的分离。这也将使我能够在以后轻松提供与 API 相同的逻辑(要求)。

我选择使用通用IRepository<T>接口,T其中我的 NHibernate 映射实体之一都实现了 IEntity(我的接口实际上只是一个标记)。

问题是这违背了聚合根模式,我开始感受到贫血域模型的痛苦。

如果我改变一个挂在另一个物体上的物体

  • 根 <- 已更改
    • 孩子 <- 改变了

在我的服务中,我必须执行以下操作:

如果我不先救孩子,我会从 NHibernate 得到一个例外。我觉得我的通用存储库(我目前在一项服务中需要 5 个)不是正确的方法。

我觉得不是让我的代码更灵活,而是让它更脆弱。如果我添加一个新表,我需要在我的所有测试中更改构造函数(我使用 DI 来实现,所以这还不错),但它看起来有点臭。

有人对如何重组这种架构有任何建议吗?

我应该让我的存储库更具体吗?服务抽象层是不是太过分了?

编辑:有一些很好的相关问题有帮助:

0 投票
2 回答
818 浏览

unit-testing - 如何测试我的存储库实现?

我将 NUnit 用于测试单元。我在域上有我的接口,所以我准备在持久层中实现这些接口。我的问题是您实际上如何进行单元测试以测试这些存储库?我相信直接从数据库测试这不是一个好主意。我听说有人在使用 SQLite,但可以使用模拟来代替吗?当您可以提供带有实际实体的模拟时,为什么人们将 SQLite 用于内存数据库?

任何例子也将受到欢迎。

注意:这是用 C# 编码的存储库,将使用 NHibernate 和 Fluent NHibernate 作为映射。

谢谢。

0 投票
2 回答
4234 浏览

domain-driven-design - 您如何使用 DDD 中的实体持久化/恢复聚合根?

基于领域驱动设计中的以下定义:解决软件核心的复杂性,

聚合是:为了数据更改而将其视为一个单元的一组关联对象。外部引用仅限于 AGGREGATE 的一个成员,指定为根。一组一致性规则适用于 AGGREGATE 的边界。

我不认为聚合根应该包含对存储库的引用。由于聚合根是唯一应该持有对其实体和聚合的引用的根,它们应该是私有的。

我的存储库如何保留和恢复这些私有数据?


编辑:

让我们以经典的 Order、OrderLines 为例。

订单是聚合根。

它的线条是实体。

由于聚合根(订单)是唯一允许保存对其实体(订单行)的引用的对象,我不明白如何从存储库中保留订单行。

0 投票
3 回答
627 浏览

c# - C# Respository 接口与使用泛型的 id 方法选择?

我试图想出一种通用的方法来通过我的存储库中的 Id 拉取一个对象。在我的数据库中,通常所有的 ID 都是主键并且是整数类型。可能有一种情况,在这种情况下不正确,但我仍然想为所有对象保持相同的方法。这是我的界面现在的样子:

我已经看到了一些代码,其中使用反射来获取对象的 ID,然后解析该特定对象的所有对象(不理想)。我也看到过这样的事情:

我从这里得到了这个想法。

我还不太熟悉表达式,不确定这是否适合我。我想它会,因为我可以包含这个表达式:

但我想这不是真正的 GetById,而是我可以使用任何表达式来获得我想要的,对吧?

任何想法都会受到赞赏。

0 投票
1 回答
522 浏览

language-agnostic - 存储库模式:每个聚合或每个底层数据存储的存储库?

建议每个聚合有一个存储库。

但是,我有一个案例,可以从 2 个异构数据存储中获取相同的聚合对象。对于背景,该对象是:

  1. 从数据存储A中获取(远程和只读)
  2. 呈现给用户进行验证
  3. 验证时,导入数据存储B(本地和读写)
  4. 它可以从数据存储B中获取和修改

显然(或不是),我不能为此拥有一个唯一的聚合存储库 - 在某些时候我需要知道从哪个数据存储中获取对象。

鉴于域层应该忽略基础设施,我的特殊情况以某种方式打破了我对存储库模式和一般 DDD 应该如何正确实现的理解。

我是不是搞错了什么?