假设我有两个实体User和Item.这两个实体之间域中的唯一行为是用户可以喜欢某个项目.由于对用户可以喜欢的项目数量没有限制,因此这种多对多关系可能很大.
我不认为让用户在其模型中包含他们喜欢的项目列表或其他方式在性能方面是明智的,因为我必须加载一个可能大的项目集合才能添加一个项目.从域设计的角度来看,让任何一个实体在其字段中引用另一个实体都没有意义,因为没有行为需要存在项目或用户的集合.
我需要保持这种关系,因为UI需要显示用户喜欢的项目列表和喜欢项目的用户列表.这个要求可以通过读取模型提供,但我仍然需要一个域概念来捕获这种关系,以便它可以被持久化.
我可以提出的一种方法是引入聚合的关系类型,比如UserLikeItem,并且让user.like(item)方法返回UserLikeItem的一个实例,然后我可以使用UserLikeItemRepository来持久化.
这是有效的解决方案吗?DDD模拟这种大型但非行为关系的自然方式是什么?
什么是聚合以及它们如何在CQRS(Command-Query-Responsibility-Segregation)和ES(Event-Sourcing)中使用?我是这种建筑的新手,如果有人可以向我解释,我会很高兴.谢谢!
简单的问题:在持久化之前,存储库是否应该验证实体?验证=检查所有值是否与规则匹配(如名称<50个字符等).
entity domain-driven-design ddd-repositories repository-pattern
仍然阅读和学习DDD并尝试将其应用于我正在进行的项目.我仍然试图绕过Aggregates并遇到一个有趣的问题.
假设我有2个聚合,1个拥有root用户实体,另一个用户实体用于root用户.
没有用户但用户可以创建帐户,这就是为什么它们都作为自己的聚合的根.注意,它们的聚合包括其他实体,但这对我的问题并不重要.
一些业务规则:1)创建帐户时,它必须与用户关联.如果用户不存在,则必须先创建它.
2)删除帐户时,还必须删除其关联的用户.
3)创建用户时,不需要与帐户关联.
3)删除用户时,如果与帐户关联,则也必须删除.
由于帐户和用户形成自己的聚合,因此可能会有自己的存储库.这意味着每个存储库都将定义标准的Add,Delete,Find和Delete方法.
因此,在这些情况下,完成以下操作的最佳方法是:1)创建帐户时,我想我会在其用户属性上调用一个方法来验证用户确保它存在.这是正确的吗?
2)删除帐户时,如何删除其关联的用户.从帐户Repoistory?但这不只是重复用户存储库中的代码吗?或者存储库可以引用并互相调用吗?
3)当用户被删除时,最好的方法是确定它是否与帐户相关联并删除它而没有代码重复(可能与第二个问题类似).
我在某处读到如果逻辑跨越两个实体或聚合,请考虑使用服务.但我对此并不满意,因为什么阻止了客户端(假设API将在不断发展,用户将来还有其他演示文稿)绕过服务并只是调用存储库?
更新1:
刚刚意识到这可能是一个相关的问题:我应该如何在聚合根之间强制实现关系和约束?
java domain-driven-design repository aggregateroot aggregates
在这篇文章中说:
实体框架使您可以将自定义数据类与数据模型一起使用,而无需对数据类本身进行任何修改.这意味着您可以将"普通旧"CLR对象(POCO)(例如现有域对象)与您的数据模型一起使用.这些POCO数据类(也称为持久性无知对象)映射到数据模型中定义的实体,支持大多数与实体生成的实体类型相同的查询,插入,更新和删除行为.数据模型工具.
POCO是一个有行为的DTO.
那么POCO和实体不一样吗?有什么区别?
我是 DDD 的初学者,我尝试用 C# 优雅地建模下一个场景:
基本上只有一个名称属性和必须按特定顺序执行的项目列表的模板。
public class Template
{
public string Name { get; set; }
public List<Item> Items { get; set; }
}
public class Item
{
public string Name { get; set; }
public int Order { get; set; }
}
Run Code Online (Sandbox Code Playgroud)一种称为 Profile 的类型。
public class Profile
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)profile 类的意思是
这看起来像是聚合根是模板,其中包含项目列表和配置文件列表。但我觉得按配置文件名称搜索需要我搜索具有给定名称的配置文件的所有模板。不知何故,对于具有 CRUD 背景的人来说,这似乎要付出高昂的代价。此外,配置文件是使用模板的配置文件,并且让模板了解使用它的配置文件似乎是错误的。
你如何建模?这里的聚合根应该是什么?是不止一个吗?如果您想从 UI 中使用搜索,如何执行搜索?