在DDD中跨集合搜索

时间:2019-02-28 16:21:59

标签: architecture domain-driven-design code-first

我在DDD中有以下情况。

public class Document
{
public int Id {get;set;}
public string DocumentCode {get;set;}
public int BuyerId {get;set;}
}

public class Buyer
{
public int Id {get;set;}
public string Name {get;set;}
}

现在,我要搜索包含名称为“ John”的买方的所有文档。

由于买方是一个不同的集合,所以我在考虑这些情况

创建新的汇总

public class DocumentSearch
{
public int Id {get;set;}
public string DocumentCode {get;set;}
public int BuyerId {get;set;}
public string Name {get;set;}
}

此处的“问题”是,该汇总需要听取买方的任何更改并在本地应用更改。

保持一切正常。

然后在数据库级别上创建一个视图,该视图将用作新的聚合。这里的问题是,它违反了所有DDD原则,并且该应用程序并不是真正的持久性不了解

进行搜索并加入应用级别

基本上对文档进行搜索,对买方进行搜索,然后在应用程序级别加入它。我相信这将需要更多的时间和精力,因为这两个集合最初会更大,然后实际上应该在合并搜索中?

遵循DDD原则应该走什么路? CQRS是最终的解决方案,但我正在寻求通往CQRS的过渡解决方案

1 个答案:

答案 0 :(得分:0)

  

提出问题不应改变答案。

由于搜索不会改变答案,因此通常不需要域模型或域实体来支持它。

通常的解决方案是(a)直接查询数据模型或(b)创建“读取模型”以支持查询。

(a)恰好是锡上所说的。如果要将数据存储在RDBMS中,则只需查询-> dto? ->回应。

在查询支持不可行的地方经常使用读取模型。读取模型实际上是缓存的DTO-您可以在事情发生变化时构建集合的表示形式。通常,您会看到这是异步完成的-针对“最新”表示形式运行查询,并运行后台工作流以将更改传播到该表示形式。