领域驱动设计:每个聚合根的存储库?

ebb*_*ebb 5 domain-driven-design repository

我正在尝试弄清楚如何完成以下任务:

User can have many Websites
Run Code Online (Sandbox Code Playgroud)

在向用户添加新网站之前,我需要做的是获取网站 URL 并将其传递给一个方法,该方法将检查该网站是否已存在于数据库中(另一个用户具有关联的相同网站),或者是否创建一个新记录。<= 原因在于是创建新缩略图还是使用现有缩略图。

问题是存储库应该是每个聚合根的,这意味着我无法执行上面解释的操作?- 我可以首先获取数据库中的所有用户,然后使用 if 语句进行 foreach 查找,检查用户在哪里拥有具有相同 URL 的网站记录,但这会导致无休止且缓慢的过程。

Jef*_*nal 4

无论您使用哪种存储库方法,您都应该能够以某种方式指定标准。因此,搜索与相关网站关联的用户 - 如果搜索未返回任何用户,则该网站未被使用。

例如,您可以添加具有以下签名的方法(或者您将传递一个查询对象,如本文所述):

User GetUser(string hasUrl);
Run Code Online (Sandbox Code Playgroud)

该方法应该生成或多或少像这样的 SQL:

select u.userId
from   User u
join   Website w
on     w.UserId = u.UserId
where  w.Url    = @url
Run Code Online (Sandbox Code Playgroud)

这应该几乎与Website直接查询表一样高效;无需将所有用户和网站记录加载到内存中。让您的关系数据库承担繁重的工作,并让您的存储库实现(或对象关系映射器)处理转换。