问题标签 [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 投票
3 回答
3305 浏览

apache-flex - DDD 和异步存储库

我们正在开发一个使用 RMI 和 JMS 连接到 Java 后端的富客户端(用 Flex 编写)。我正在考虑以 DDD 方式实现客户端,以便它具有用于域对象上的 CRUD 操作的存储库。

然而,问题是所有后端通信都是异步发生的,我无法强制客户端等待继续,直到它收到响应。这意味着,在低级别上,我可以调用远程对象上的方法并获得 AsyncToken 作为返回值。然后我可以监听 asynctoken 上的事件以查看调用是通过还是失败。然而,这打破了存储库背后的主要思想,向客户隐藏技术细节。

我猜可能有两种选择:

  1. 让存储库上的方法返回 asynctoken,这对我来说似乎是一个混乱的解决方案
  2. 让这些方法返回一个空集合(例如 findAll),当收到响应时该集合将被填充。

两者都有优点和缺点,我想从你们那里得到一些意见。

(更进一步,什么是好的缓存策略?根据情况,我不希望存储库在每次向它请求所有实体时都调用服务器。这将如何影响存储库上方法的签名。 )

0 投票
3 回答
699 浏览

c# - 领域驱动设计 - 逻辑删除

所以,我建立了一个很好的域模型。存储库处理数据访问等等。弹出了一个新要求,表明需要使用删除记录原因。到目前为止,删除都相当简单 => Entity.Children.Remove(child)。由于我的 ORM 工具正在处理状态管理,因此没有进行内部更改跟踪。但是,我不确定如何处理这个问题。

1)我可以在父实体中保留一个已删除的子集合,并将更改跟踪从 nHibernate 中拉出并自己处理。

2)??????

0 投票
3 回答
946 浏览

asp.net-mvc - 有没有完美的代码生成工具来生成 MVC Storefront?

有没有人知道一个好的代码生成工具(除了 Subsonic,因为它在当前版本中不支持 IQueryable)以 Rob Conery 在 MVC Storefront 中工作的方式生成存储库和其他项目?

0 投票
5 回答
2735 浏览

c# - 使用 LINQ to SQL 时出现问题,每个原子操作都有一个 DataContext

我已经开始在一个(有点像 DDD 的)系统中使用 Linq to SQL,它看起来(过于简化)如下所示:

现在,我遇到了一个问题。当我尝试像这样使用 SomeEntityRepository

一切正常,直到程序到达最后一个 WriteLine,因为它抛出一个ObjectDisposedException,因为 DataContext 不再存在。

我确实看到了实际问题,但是我该如何解决呢?我想有几种解决方案,但迄今为止我所想到的没有一个适合我的情况。

  • 摆脱存储库模式,并为工作的每个原子部分使用新的 DataContext。
    • 我真的不想这样做。一个原因是我不想让应用程序知道存储库。另一个是我不认为让 linq2sql 的东西 COM 可见会很好。
    • 另外,我认为这样做context.SubmitChanges()可能会比我预期的要多得多。
  • 指定 DataLoadOptions 以获取相关元素。
    • 因为我希望我的业务逻辑层在某些情况下只回复一些实体,所以我不知道他们需要使用哪些子属性。
  • 禁用所有属性的延迟加载/延迟加载。
    • 不是一个选择,因为有很多表,而且它们的链接很紧密。这可能会导致大量不必要的流量和数据库负载。
  • 互联网上的一些帖子说使用 .Single() 应该会有所帮助。
    • 显然它不...

有什么办法可以解决这个痛苦吗?

顺便说一句:我们决定使用 Linq t0 SQL,因为它是一个相对轻量级的 ORM 解决方案,并且包含在 .NET 框架和 Visual Studio 中。如果 .NET 实体框架更适合这种模式,则可以选择切换到它。(我们在实施方面还没有那么远。)

0 投票
4 回答
10982 浏览

domain-driven-design - 存储库模式:如何延迟加载?或者,我应该拆分这个聚合吗?

我有一个具有编辑器和项目概念的域模型。

一个Editor拥有多个Projects,一个Project不仅有一个Editor owner,还有多个Editor members。因此,一个编辑器也有许多“加入”的项目。

我正在采用 DDD 方法对此进行建模并使用存储库模式进行持久化。但是,我对模式的理解还不够好,无法确定我应该如何做到这一点。

我正在假设 Editor 和 Project 可能在同一个聚合中,根是 Editor。因此,我可以获得一个编辑器,然后枚举其项目,并可以从那里枚举项目的成员编辑器。

但是,如果我只被允许从我的存储库中检索编辑器,这是否意味着当我获得拥有它们的编辑器时,我必须从存储库中加载所有项目?如果我想延迟加载成员编辑器,项目是否也需要对存储库的引用?

或者,如果我拆分聚合并拥有一个编辑器存储库和一个项目存储库,我应该如何处理两者之间的事务,例如将新项目添加到编辑器时?例如:

我是否误解了存储库模式的意图?

0 投票
5 回答
1018 浏览

language-agnostic - 使用域模型和 POCO 类时,查询在哪里?

我是域模型、POCO 和 DDD 的新手,所以我仍在努力思考一些想法。

我还没有弄清楚的一件事是如何保持我的域模型简单且与存储无关,但仍然能够以丰富的方式对其数据执行一些查询。

例如,假设我有一个包含 OrdemItems 集合的实体 Order。无论出于何种原因,我都想获得最便宜的订单商品,或者可能是目前没有库存的订单商品清单。我不想做的是从存储中检索所有订单项目并稍后过滤(太昂贵),所以我想最终以某种方式获得“SELECT .. WHERE ITEM.INSTOCK = FALSE”类型的数据库查询。我不想在我的实体中使用该 SQL 查询,或者任何变体是否会将我绑定到特定平台,例如 Linq2SQL 上的 NHibernate 查询。在这种情况下,常见的解决方案是什么?

0 投票
4 回答
2779 浏览

domain-driven-design - 所有“批量”操作在 DDD 中属于哪里?

在 DDD 中,关键概念之一是存储库,它允许您检索实体(或聚合根),然后在更新后将它们保存回来。

假设我们需要对实体执行一些“批量”操作,并且实体的数量使得将它们检索到内存中是绝对不可能的。ie操作只能在数据库中进行。

这种“批量”操作的地方在哪里?它应该是存储库上的方法吗?它不会通过数据库特定操作“泄漏”存储库抽象吗?它不会将业务操作从实体转移到存储库吗?

0 投票
2 回答
1145 浏览

nhibernate - 关于域对象的存储库及其保存方法的问题

关于 DDD、存储库模式和 ORM,我有一个有点荒谬的问题。在这个例子中,我有 3 个类:AddressCompanyPerson。一个人是公司的成员并且有一个地址。公司也有地址。

这些类反映了一个数据库模型。我删除了我的模型的所有依赖项,因此它们不会绑定到特定的 ORM 库,例如 NHibernate 或 LinqToSql。这些依赖关系在存储库中处理。

在其中一个存储库中有一个SavePerson(Person person)方法,该方法根据 Person 是否已存在于数据库中来插入/更新它。

由于 Person 对象有一个 Company,因此我目前在进行 SavePerson 调用时也保存/更新了 Company 属性的值。在此过程中,我插入/更新公司的所有数据 - 名称和地址。

但是,我真的很难想到公司的数据在与人打交道时会发生变化的情况——我只想能够将公司分配给一个人,或者将一个人移动到另一个公司。我不认为我想和一个新人一起创建一个新公司。所以 SaveCompany 调用引入了不必要的数据库调用。保存 Person 时,我应该能够更新 CompanyId 列。

但是由于 Person 类有一个 Company 属性,我有点倾向于用它来更新/插入它。从严格/纯粹的角度来看,SavePerson 方法应该保存整个 Person。

首选的方式是什么?只是在保存 Person 或保存其所有数据时插入/更新 Company 属性的 CompanyId?或者你会为这两种场景创建两种不同的方法(你会给它们起什么名字?)

另外,另一个问题,我目前有不同的方法来保存一个人、一个地址和一个公司,所以当我保存一个公司时,我也会调用 SaveAddress。假设我使用 LinqToSql——这意味着我不在同一个 Linq 查询中插入/更新公司和地址。我猜有 2 个 Select Calls(检查公司是否存在,检查地址是否存在)。然后对两者进行两次插入/更新调用。如果引入更多的复合模型类,则更多。LinqToSql 有没有办法优化这些调用?

编辑

另请参阅此后续问题。值对象如何存储在数据库中?

0 投票
5 回答
8804 浏览

domain-driven-design - 实体可以访问存储库吗?

我刚刚开始使用 DDD,所以也许这是一个愚蠢的问题......

实体可以访问存储库(通过某些 IRepository 接口)以在运行时获取值吗?例如,我想对属性强制执行“默认”选择:

我的问题是,做这样的事情是否严重违反了 DDD 原则。如果不是,我的下一个问题是提供存储库以供使用的最佳方式是什么?是否应该在创建 Person 对象时提供?

谢谢,P

0 投票
1 回答
1562 浏览

ddd-repositories - DDD:在哪里获取值对象列表最合适

我有一个分配给产品的名为“产品类型”的值类型。(一个产品有一个产品类型)

为了允许用户从列表中选择类型,我将填写一个下拉列表。在哪里检索产品类型列表最合适?一个实现存储库模式的类?

编辑:通过将产品代码更改为产品类型来澄清。产品类型类似于“DVD”/“CD”/“蓝光”/等。