【发布时间】:2019-07-22 15:04:27
【问题描述】:
我在 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 原则,并且应用程序并不是真正无知的持久性
在应用级别进行搜索和加入
基本上在 Document 上进行搜索,在 Buyer 上进行搜索并在应用程序级别加入。我相信这需要更多的时间和精力,因为这两个集合最初都会更大,然后它们实际上应该在合并搜索中?
为了遵循 DDD 原则,有什么方法可以走? CQRS 是终极解决方案,但我正在寻找 CQRS 途中的临时解决方案
【问题讨论】:
-
目前还没有 100% 适应 DDD,但您的班级
DocumentSearch似乎实际上可能是搜索的(单个)结果之一。我想你可能想要一个搜索请求类,即class DocumentSearchRequest { public string NameToSearch { get; set; } }。在应用程序级别,使用请求类(小集)进行“应用程序级别的搜索和加入”并返回结果类的集合。原谅我可能有的任何 DDD 无礼(此时):-) -
根据 Greg Young 的说法,没有 CQRS 就无法完成 DDD。如果你不使用 CQRS,你应该预料到很多问题没有像这样的干净解决方案。
标签: architecture domain-driven-design code-first