【问题标题】:Asp.Net Core 3.1 Remove Aggregate Root with DDD pattern in EFCoreAsp.Net Core 3.1 在 EFCore 中使用 DDD 模式删除聚合根
【发布时间】:2020-08-01 14:57:11
【问题描述】:

我尝试为我的应用程序使用 DDD,当创建或编辑聚合根时,我添加了将在 SaveChange on me 存储库中引发的 DomainEvent。

现在我的问题在于删除操作,因为我的实体根具有创建或删除的功能,但删除操作的唯一方法是在存储库上调用删除,就像我在其中一个 CommandHandler 中的代码一样

entity.AddDomainEvent(new NodeRemovedPublicEvent(request.NodeId));
_repository.Delete(entity);
await _repository.UnitOfWork.SaveChangesAsync();

这样我需要记住每次使用_repository.Delete() 时都要创建一个域事件。我不喜欢这种操作,这种情况有最佳实践吗?

编辑 1:(永远不要删除)。 我认为这是最好的方法,以避免删除中的事务问题,ecc ...这样我需要实现逻辑删除。在我的情况下,当根身份被删除(逻辑删除是相同的)时,我需要删除其他实体(逻辑删除)。为此,我需要生成一个域事件。如果我不提出那个事件,我的实体有逻辑删除,而订单实体没有。确实,如果没有该实体,订单实体将无法加载,但我需要知道相关实体已“链接”到逻辑删除的实体。 例如,如果我删除广告用户,并且该用户拥有实体 Food,我需要删除分配给该用户的所有 Food 实体。

【问题讨论】:

    标签: asp.net-core entity-framework-core domain-driven-design


    【解决方案1】:

    我没有足够的声望给你的帖子添加评论,但你应该看看 Udi Dahan 的这篇帖子:Don’t Delete – Just Don’t

    我认为您正在寻找的最佳做法是“不删除”任何内容。回到 UL 并讨论实际发生的情况,而不是删除某些内容。我的意思是,在现实世界中,不只是“删除”。

    【讨论】:

    • 是的,我认为这是避免删除、ecc 中的事务问题的最佳方法...但是例如您说要检查删除。在我的情况下,当根身份被删除(逻辑删除它是相同的)时,我需要删除其他实体。为此,我需要生成一个域事件。如果我不提出那个事件,我的实体有逻辑删除,但订单实体没有。确实,如果没有该实体,订单实体将无法加载,但我需要知道相关实体已“链接”到逻辑删除的实体。
    • 例如,如果我删除了广告用户,并且用户拥有实体 Food,我需要删除分配给该用户的所有 Food 实体。
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多