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

c# - 返回的存储库模式和数据类型

我正在使用存储库模式并且想知道我应该返回什么数据类型。在我的数据库中,我有一个可变长度的字符串,需要根据固定长度进行分解。我最初考虑传递字符串并让服务层根据配置列的长度进行解析。我真的不喜欢从存储库层传递字符串的想法,宁愿传递一个完整的对象。传递字符串似乎没有足够的责任分离,但是让存储库不得不使用另一种方法来获取应该如何解析字符串并且进行解析似乎对于 repo 来说工作量太大。在这种情况下,回购和服务的责任应该是什么?

0 投票
2 回答
1135 浏览

domain-driven-design - 在 DDD 中,实体的集合属性是否允许具有部分值?

在领域驱动设计中,实体的集合属性是否允许具有部分值?

例如,Customer.Orders、Post.Comments、Graph.Vertices 等属性是否应该始终包含所有订单、评论、顶点,或者是否允许包含今天的订单、最近的评论、孤立的顶点?

相应地,存储库是否应该提供类似的方法

ETC。?

0 投票
1 回答
537 浏览

ddd-repositories - DDD - 返回数据库键的存储库模式?

这里有一个很大的设计缺陷,但我无法解决它:

业务需求有点涉及,所以我会尽量保持简单。我们有一张购买表和一张退货表。当进行退货时,我们必须在数据库中找到返回最旧购买的匹配项,并将其记录在“已应用退货”表中。

因此,当我在该交易中插入退货时,我需要将退货应用于购买记录。

就目前而言,我们有一个服务调用存储库以进行插入。服务需要知道插入记录的键是什么,以便它可以通过使用该键插入“已应用”记录来完成事务。

我们基本上被卡住了,因为我的理解是存储库不应该返回这种数据。这不是破坏了存储库是一个集合的想法吗?

什么是替代方案?

澄清:

我们有一个 Purchase 表、一个 Return 表和一个 Applied 表

申请的表看起来像这样 purchaseId returnId qtyReturned

因此,当插入退货时,我需要购买的 id(由某些业务规则决定)和新插入的退货的 id。

0 投票
1 回答
740 浏览

linq-to-sql - 没有 ORM 的存储库,用于保存对象图

我知道创建存储库来检索没有 ORM 的域模型是相当直接的(没有 LINQ 或其他 ORM 的存储库模式?)。但是,如何保存域模型及其内部对象图呢?

在这里,我们需要了解更改跟踪等。如何实现它?

对于我的具体实现,我将 Linq to Sql 视为 Dao。Linq to sql 确实更改跟踪,但我创建的域模型不是。它们是直接的 POCO,而不是由 linq 直接映射到 sql。一切都由自定义 DataMapper 完成

有没有直接的方法来实现存储库来保存对象图而不将 linqToSql 或 NHibernate 暴露给域层?或者我在这里错过了什么?

0 投票
1 回答
927 浏览

c# - 使用传统 ado.net 对聚合根进行 CRUD

任何人都可以向我展示使用传统 ado.net 聚合根的简单 CRUD 语句吗?提前致谢!

0 投票
1 回答
379 浏览

asp.net-mvc - Facebook 连接 + MVC 模型

我正在开发一个 ASP.NET MVC 项目,我正在尝试通过使用 facebook 连接 API 将其与 facebook 集成。现在,我在想象概念布局的方式时遇到了一个小问题。我在 MVC 中使用存储库模型,我有自己的数据库。我希望能够从 FB 获取用户的信息,并可能将他们的 fb_uid 存储在我的数据库中(这是否合法?)我还希望能够将故事发布到用户的迷你提要中。我有一个名为 User 的模型类;这个类必须填充来自我的内部数据库和 FB 数据库的数据。我有与数据库通信的存储库类,但我真的不知道应该在哪里/哪个部分与 FB 通信?我曾想过使用 FBDeveloperToolkit,但从我在这个论坛上看到的内容来看,该工具包有点过时了!我不知道我是否应该使用 XFBML 和纯 javascript 函数?如果是,如何将数据拉回我的数据库,例如用户的 fb_uid?这是否意味着我将直接从我的表示层调用 API 函数?

有人可以帮我吗?

谢谢!

0 投票
2 回答
2702 浏览

language-agnostic - 其他存储库的 DDD 存储库意识

通常可以接受一个存储库可以访问另一个存储库吗?特别是在这种情况下,我有一个聚合根,它使用另一个聚合根来确定要添加的实体。它符合项目/项目类型关系。项目类型是聚合根的原因是它们可以在任何单个项目范围之外的管理工具中单独维护。

如果它确实重要,我只是通过存储库工厂实现创建我的存储库实例,所以我不会直接通过具体的类名创建它。聚合体在任何时候都不知道存储库。

编辑 - 更多信息:

具体实现是我们可以将图像附加到文档中。我们不仅可以管理文档上的图像,而且还有不同类型的图像(例如,类型被定义为如何实现,而不是扩展)。文档集合是系统中使用这些图像的少数几种其他对象之一,它们并不都使用相同的类型。虽然我们确实在域服务中附加了规则,但这更具体地适用于构建文档聚合。在构建聚合时,我们有五个特定类型的图像,以及其他两种类型中的一个。我们单独提取这些,因为它们存储在聚合中的单独列表中。验证不是问题,而是在组装文档时限制正在评估的图像类型。

0 投票
3 回答
359 浏览

c# - linq 2 sql如何翻译成TSQL

当您使用构造函数将 linq2sql 对象转换为域对象时,Linq2sql 似乎不知道如何构造 TSQL。如:

但是当使用可设置的属性时,就可以了。

我不想让这些属性是可设置的。我怎样才能做到这一点?任何人都可以提供关于如何将 linq 2 sql 转换为 TSQL 的思考吗?提前致谢!

0 投票
5 回答
694 浏览

visual-studio - 针对真实数据库对域服务进行单元测试

我想知道其他人可能有什么方法可以针对数据库测试域服务?我已经有一系列模拟存储库,我可以在域服务中使用它们来测试域服务本身。这些模拟存储库的部分构造是它们构建示例聚合和关联实体,并根据模型中使用的相同业务规则验证它们。这也提供了一种很好且简单的方法来检测实体本身内的潜在影响点,以防它们的界面发生变化。

我在对我的 SQL 支持的存储库进行实时测试时看到的主要问题是数据库一致性。例如,一旦运行测试,“创建”方面已经运行。再次运行它们显然会导致失败,因为数据库不再是原始的。我正在考虑创建一个仅用于此类测试的镜像数据库。它将是最小的,包含结构、可编程性、约束等。我还将为某些已建立的测试提供最小的数据集。我的思路是,我可以有一个存储过程,我可以调用它来在测试运行开始之前使用基本数据将数据库重置为“原始”状态。

虽然在最初验证功能后,这在开发人员机器上并不那么重要,但我正在更多地研究将这些测试作为夜间构建的一部分运行的重要性;以便在测试失败的情况下,可以阻止构建以不破坏目标部署环境(特别是在这种情况下,它将是测试团队使用的环境)。

我不一定认为平台很重要,但如果有人有实现特定的问题,我的环境如下所示:

Windows 7(开发)/Windows Server 2008 R2(服务器)Visual Studio 2008 Team Edition(C#)Microsoft SQL Server 2008 Standard(开发/服务器)

我正在使用 Team Build 来运行我的构建,但这很可能不是问题范围内的一个因素。

0 投票
1 回答
1575 浏览

c# - 检测聚合根中实体的变化

我希望了解人们可能采取了哪些方法来检测作为其聚合一部分的实体的变化。我有一些有用的东西,但我并不为此而疯狂。基本上,我的存储库负责确定聚合根的状态是否已更改。假设我有一个聚合根调用Book和一个在聚合内调用的实体Page。ABook包含一个或多个Page实体,存储在一个Pages集合中。

首先,插入与更新场景是通过检查聚合根及其实体来确定键的存在来完成的。如果该键存在,则假定该对象已在某一时间保存到基础数据源。这使它成为更新的候选者;但仅基于实体的这一点并不能确定。使用聚合根,答案是显而易见的,因为只有一个并且它是唯一的入口点,可以假设密钥的存在将决定操作。在我的情况下,将聚合根本身再次保存回来是一个可接受的方案,以便我可以捕获修改日期。

为了帮助实体本身的这种行为,我的EntityBase类包含两个简单的属性:IsUpdated(), IsDeleted(). 这两个都默认为false。我不需要知道它是否是新的,因为我可以根据密钥的存在来做出决定,如前所述。实现上的方法(在本例中为 Page)将具有将支持数据集更改IsUpdated()为 true 的每个方法。

因此,例如,Page 有一个方法调用UpdateSectionName(),它更改属性的支持值SectionName,它是只读的。这种方法一直被使用,因为它允许在执行该数据设置的方法(防止实体进入无效状态)中使用验证器的逻辑连接点。最终结果是我必须this.IsUpdated() = true;在方法的末尾放一个。

当聚合根被发送到存储库Save()(逻辑切换到Insert()Update()操作)时,它可以遍历 中的Pages集合Book,查找具有以下三种情况之一的任何页面:

  1. 没有钥匙。Page将插入没有密钥的 A。
  2. IsDeleted = true;删除胜过更新,删除将被提交 - 忽略Page.
  3. IsUpdated = true;将为页面提交更新。

这样做可以防止我盲目地更新 Pages 集合中的所有内容,例如,如果 Book 中有数百个 Page 实体,这可能会令人生畏。我一直在考虑检索这本书的副本,并进行比较并仅提交检测到的更改(基于存在和/或比较的插入、更新和删除),但这似乎是一种非常健谈的方式.

主要缺点是开发人员必须记住在实体的每个方法中设置 IsUpdated。忘记一个,它将无法检测到该值的变化。我玩弄了某种自定义后备存储的想法,它可以透明地为更改添加时间戳,这反过来又可以创建IsUpdated一个只读属性,存储库可以使用它来聚合更新。

存储库正在使用工作单元模式实现,该实现基于聚合根添加到它时生成的时间戳。由于可能有多个实体排队等待操作,因此在执行实体所属的聚合根操作后立即汇总并执行实体操作。我可以看到更进一步并创建另一个工作单元来处理实体操作并将它们基于实体中使用的某种事件跟踪(这就是我假设市场上的一些 ORM 产品完成的方式类似的功能级别)。

不过,在我继续朝这个方向前进之前,我很想听听有关这方面的想法/建议/经验。

编辑:一些可能有助于了解的附加信息:

  1. 我目前使用的语言是 C#,尽管我试图尽可能多地保留特定于语言的信息,因为这更多是理论上的讨论。
  2. 存储库/服务/实体/等的代码。是基于 Tim McCarthy 在他的书“使用 C# 的 .NET 域驱动设计”和CodePlex上的支持代码中的概念。它提供了对所采用方法类型的可运行理解,尽管我正在使用的内容在很大程度上已经从头开始重写。