asp.net-core - Asp.Net Core 3.1 在 EFCore 中使用 DDD 模式删除聚合根
问题描述
我尝试为我的应用程序使用 DDD,当创建或编辑聚合根时,我添加了将在我的存储库的 SaveChange 中引发的 DomainEvent。
现在我的问题是删除操作,因为我的实体根具有创建或删除的功能,但删除操作的唯一方法是在存储库上调用删除,就像我在其中一个 CommandHandler 中的代码一样
entity.AddDomainEvent(new NodeRemovedPublicEvent(request.NodeId));
_repository.Delete(entity);
await _repository.UnitOfWork.SaveChangesAsync();
这样,我需要记住每次使用_repository.Delete() 时都要创建一个域事件。我不喜欢这种操作,这种情况有最佳实践吗?
编辑1:(不要'删除永远)。我认为这是最好的方法,以避免删除中的事务问题,ecc ...这样我需要实现逻辑删除。在我的情况下,当根身份被删除(逻辑删除是相同的)时,我需要删除其他实体(逻辑删除)。为此,我需要生成一个域事件。如果我不提出那个事件,我的实体有逻辑删除,而订单实体没有。确实,如果没有该实体,订单实体将无法加载,但我需要知道相关实体已“链接”到逻辑删除的实体。例如,如果我删除了广告用户,并且用户拥有实体 Food,我需要删除分配给该用户的所有 Food 实体。
解决方案
我没有足够的声望给你的帖子添加评论,但你应该看看 Udi Dahan 的这篇帖子:不要删除 - 只是不要
我认为您正在寻找的最佳做法是“不删除”任何内容。回到 UL 并讨论实际发生的情况,而不是删除某些内容。我的意思是,在现实世界中,事情不仅仅是“删除”。
推荐阅读
- r - QAP分析如何保证行名和列名顺序一致
- python - 如何纠正 IndexError
- c++ - C++中的概念多态性
- python - 在 Python 中用图片训练 SVM
- c# - 如何在不创建新数组的情况下更改数组中元素的数量
- android - 作为系统应用程序运行时,Android 不允许执行本机库
- c++ - 错误:无法将“float”转换为“float*”作为参数
- angularjs - 角度 1.x 是否仍然相关
- php - 无法在 OneNote 共享笔记本中获取分区
- apache-spark - spark-submit 适用于 yarn-cluster 模式,但 SparkLauncher 不适用,具有相同的参数