问题标签 [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 回答
851 浏览

c# - 领域驱动设计布局问题

我是 DDD 的新手。我有一个配置文件类和一个配置文件存储库类。PROFILE 类包含以下字段 -> Id、Description、ImageFilePath

因此,当我添加一个新的配置文件时,我将图像上传到服务器并将其路径存储在我的数据库中。

当我删除配置文件时,图像也应该从我的文件系统中删除。

我的问题:

我在哪里为此添加逻辑。我的配置文件存储库有一个 Delete 方法。我应该在这里添加这个逻辑。或者我应该添加一个服务来封装这两个操作。

任何评论将不胜感激...

谢谢

0 投票
3 回答
1420 浏览

domain-driven-design - 关于领域驱动设计的问题

在阅读了 Eric Evans 的领域驱动设计之后,我有几个问题。我搜索过,但没有找到令人满意的答案。如果你们中的任何人对以下问题有清楚的理解,请告诉我。

我的担忧是

  1. 存储库用于从 DB、Web 服务中获取已经存在的聚合。如果是,可以存储库也有这个实体的交易调用(即转账金额,发送账户详细信息......等)

  2. 实体是否可以拥有具有业务逻辑的方法,在这些方法中它调用基础设施层服务来发送电子邮件..日志等(实体方法直接调用 IS 服务)。

  3. 存储库实现和工厂类将驻留在基础设施层中。这是正确的说法吗?

  4. UI 层(控制器)可以直接调用 Repositry 方法吗?还是我们应该从应用层调用这些?

我的脑海中仍然有很多困惑......请指导我......我正在使用 Eric Evan 的域驱动设计的书籍...... .NET 使用 C# 的域驱动设计

0 投票
2 回答
2028 浏览

nhibernate - 使用 NHibernate 和 Spring.Net 实现存储库

我正在尝试掌握 NHibernate、Fluent NHibernate 和 Spring。

遵循领域驱动的设计原则,我正在编写一个标准的分层 Web 应用程序,其中包括:

  • 表示层 (ASP.Net)
  • 一个业务层,包括:
    • 应用层(基本上是一组对 UI 层可见的方法)
    • 存储库接口和域组件(由应用层使用)
  • 持久层(基本上是业务层中定义的存储库接口的实现)

我想帮助确定一种实例化 NHibernate ISession 的方式,以便它可以在对业务层的单个请求的整个生命周期内由多个存储库共享。具体来说,我想:

  • 允许在存储库实现之外控制 ISession 实例和任何事务(可能通过 IOC 框架的某些方面,一个拦截器?)

  • 允许 ISession 实例以测试友好的方式可用于存储库(可能通过注入或通过一些共享的“上下文”抽象)

  • 避免创建任何不必要的事务(即仅执行只读操作时)

  • 允许我编写使用 SQLLite 的测试

  • 允许我使用 Fluent NHibernate

  • 允许存储库实现对主机环境保持无知。我还不知道业务层是否会与表示层一起在进程内运行,或者将在 WCF 下(在 IIS 中)单独托管,所以我不想将我的代码过于紧密地绑定到 HTTP 上下文(例如)。

我第一次尝试解决这个问题是使用注册表模式。将 ISession 实例存储在 ThreadStatic 属性中。然而,随后的阅读表明这不是最好的解决方案(因为 ASP.Net 可以在页面生命周期内切换线程,我相信)。

任何想法、零件解决方案、模式名称、最新示例(NHibernate 2)的指针将不胜感激。

0 投票
2 回答
946 浏览

linq-to-sql - 具有遗留数据库和 Linq to SQL 的存储库模式

我正在遗留数据库(我无法更改)之上构建一个应用程序。我使用 Linq to SQL 进行数据访问,这意味着每个表都有一个(Linq to SQL)类。

我的域模型与数据库不匹配。例如,有两个名为Usersand的表Employees,因此我有两个名为Userand的 Linq to SQL 类Employee。但是在我的域模型中,我希望有一个User类应该包含任一表中的一些字段(但我不关心这些表的许多其他字段)。

我不确定我应该如何设计我的存储库:

  • 存储库是否应该执行 Linq 到 SQL 类(例如)到域类 ( ) 之间的映射User,并且只将域类返回给应用程序EmployeeUser
  • 或者我的存储库是否应该将 Linq 返回到 SQL 类并将映射留给调用者

第一种方法对我来说似乎更有意义,但这是实现我的存储库的正确方法吗?

0 投票
3 回答
335 浏览

c# - DDD投屏问题?

前几天我在 DDD 上观看了 Greg Young 的一个屏幕投射,它谈到了持久化一个对象的所有状态转换,而不是保存时的状态,然后加载它“重播”所有这些消息以恢复当前状态。这个似乎是一个非常有趣的想法,但我不知道这个特殊的东西叫什么!我想了解更多关于它的信息,但是如果没有它的真名,我很难获得任何体面的结果。

任何人都可以启发我吗?

屏幕演员是@http ://www.infoq.com/presentations/greg-young-unshackle-qcon08

0 投票
1 回答
719 浏览

domain-driven-design - 聚合根如何删除它的一个子节点?

如果我对聚合根的理解是正确的,那么根也应该负责删除它的一个“孩子”。这似乎会转化为这样的东西:

这将有效地将其从集合中删除。然而,这是如何持续存在的?我的 ORM 的 UnitOfWork 是否应该检测到该集合中缺少某些内容,然后将其从数据库中删除?

我应该用 removeOrderLine 代替 OrderRepository 的方法吗?

0 投票
2 回答
897 浏览

c# - Nhibernate 和 Activerecord 的数据库性能

受 DDD 炒作的启发,我设计了我的课程,假装根本没有数据库。然后使用 NHibernate 将类映射到数据库表。我的部分类图如下所示:Order (hasmany)--> Product (belongsto)-->Seller。检索为某个卖家下的所有订单。我有代码:

不漂亮,但它适用于我的单元测试。在我们开始将真实数据注入数据库之前,我很高兴。演技差到想吐。所以,我对我的存储库代码做了一些调查。毫不奇怪,为了找到我想要的订单,我必须从 Order 表中获取所有数据,从 Product 表中获取所有数据以及从 Seller 表中获取一些数据。

所以,我的问题来了。作为数据库领域的一个完全傻瓜,我不知道如何改进我的存储库代码,即使我知道它很臭。所以,我很想修改我的 Order 类以引用 Seller 类,这样我就可以使用 hql 添加 Where 子句来提高性能。但是由于数据库问题而修改类结构似乎违反了DDD原则。

您有什么建议,尤其是在改进我的存储库代码方面?我已经为 ActiveRecord 和 hql 尝试过 Linq。但无法让他们工作。

0 投票
11 回答
150990 浏览

design-patterns - 什么是聚合根?

我试图弄清楚如何正确使用存储库模式。聚合根的核心概念不断出现。在搜索 Web 和 Stack Overflow 以寻求有关聚合根是什么的帮助时,我一直在寻找关于它们的讨论以及指向应该包含基本定义的页面的死链接。

在存储库模式的上下文中,什么是聚合根?

0 投票
1 回答
3056 浏览

c# - 关于过滤和排序的简单存储库问题

我有一个来自存储库的产品列表。很简单。现在我想添加过滤和排序。排序可能发生在存储库之外,因为在存储库内进行排序没有效率提升(猜测)。我无法想象在存储库之外进行过滤,因为我们只想加载我们关心的记录。我认为您会想要创建一个过滤器委托并将其传递给存储库。

下面的代码是伪 C# 代码。排序/过滤的功能代码是什么样的?

下面的过程实际上集中在将委托传递给存储库以进行过滤:

(如果这是 MS MVC,此代码将存在于控制器中):

设置过滤器:

设置排序:

返回一个视图模型:

如您所见,此代码需要一些帮助。我真的在寻找可以使这项工作的排序和过滤类代码,或指向外部资源的链接。我假设排序和过滤是 DDD 和设计模式中的标准做法,因此是个问题。假设 Product 是一个普通的旧电子商务产品;) Rob Conery 的 Ajax 笔记在这里

谢谢。

0 投票
2 回答
5627 浏览

c# - DDD - 如何实现用于搜索的高性能存储库

我对 DDD 和存储库模式有疑问。

假设我有一个客户聚合根的客户存储库。Get & Find 方法返回完全填充的聚合,其中包括地址等对象。一切都很好。但是当用户在 UI 中搜索客户时,我只需要一个聚合的“摘要”——只是一个带有摘要信息的平面对象。

我可以处理的一种方法是正常调用存储库上的 find 方法,然后在应用程序层中,将每个客户聚合映射到 CustomerSearchResult / CustomerInfo DTO,然后将它们发送回客户端。

但我的问题是性能;每个 Customer 聚合可能需要多个查询来填充所有关联。因此,如果我的搜索条件与 50 个客户匹配,那么对于可能检索我什至不需要的数据的数据库来说,这将是一个很大的打击。

另一个问题是我可能希望包含有关客户的汇总根边界之外的客户的汇总数据,例如最后一次下订单的日期。Order 有它自己的聚合,因此要获取客户的订单信息,我必须调用 OrderRepository,这也会降低性能。

所以现在我想我有两个选择:

  1. 向 CustomerRepository 添加一个附加的 Find 方法,该方法通过执行一个有效的查询返回这些摘要对象的列表。

  2. 创建一个专门构建的只读 CustomerInfoRepository,它只有 1 中描述的 find 方法。

但是这两种感觉我都在违背 DDD 的原则。我的存储库继承自一个通用基础:Repository where T : IAggregateRoot。这些摘要信息对象不是聚合,并且与 T 具有不同的类型,因此 #1 确实违背了设计。

也许对于#2,我会创建一个没有 IAggregateRoot 约束的抽象 SearchRepository?

我的领域有很多类似的场景。

你将如何实现这个场景?

谢谢,戴夫

更新

在阅读了 Theo 的答案后,我想我会选择选项 #2,并在我的基础架构中创建一个专门针对这些场景的 SearchRepository。然后,应用程序层(WCF 服务)可以调用这些存储库,这些存储库直接填充摘要 DTO,而不是将域实体映射到 DTO。

**** 更新 2 ****

虽然我在一年前问过这个问题,但我想我只是补充一下,我已经发现了旨在解决这个确切问题的 CQRS。Udi Dahan ( http://www.udidahan.com/ ) 和 Greg Young ( http://codebetter.com/gregyoung/ ) 写了很多关于它的文章。如果您使用 DDD 创建分布式应用程序,CQRS 适合您!