删除实体取决于许多条件

Removing an entity depends on many criterias

我们有一个 Doc 实体,它有一个名为 ReportDate 的 属性。当用户决定删除文档时,我们应该检查 30 个条件。这些条件相似:我们检查 30 个实体的 ReportDate 属性 不等于 Doc 的 ReportDate.

这对我来说像是一种气味。每次我们添加新实体时,我们都应该注意为删除文档添加新条件。

有 30 多个标准可以删除实体吗?非常感谢任何示例代码或项目。

我想答案基本上是"It depends"。

在领域驱动设计 (DDD) 中,我们努力基于对我们正在工作的领域中实际发生的事情以及我们开发的应用程序将如何解决问题的共同理解来对领域进行建模 业务问题。

如果域中实际上有 30 多个引用 Doc(隐式或显式,见下文),那么是的,在删除 [= 之前​​检查这 30 多个引用是正确的11=]实体。如果这些引用不是来自领域专家的实现细节的结果,那么不,检查这 30 多个引用是不正确的。它们真的是参考,还是仅仅是设计选择的结果?

在执行任何实体的删除时,您可以检查域服务中的交叉聚合条件,如果发现任何阻止Doc被删除的Related entity,则报告删除失败.

服务中此验证的示例实现可能如下所示:

public void DocDeletion.Delete(Doc doc)
{
    var relatedEntities = relatedEntityRepository.FindRelatedEntitiesWithReportDate(doc.ReportDate);

    if (relatedEntities.Any())
    {
        DomainEvents.Raise(new RelatedEntityPreventedDocDeletionEvent(doc, relatedEntities));
    }
    else
    {
        // Assumes docRepository.Delete raises relevant domain event
        docRepository.Delete(doc);
    }
}

我想分享一些我在阅读这个问题时的想法,但首先是一些假设:

  1. Doc 是聚合根
  2. Related entity 是另一个聚合中的实体
  3. Related entity 不能没有 Doc entity/aggregate

那么在我看来你在 Related entityDoc 之间有一个隐式引用,即,对于每个 Related entity.ReportDate 那里 必须 存在一个 Doc 和一个相等的 ReportDate.

我认为这种关系应该更明确,而不是添加对包含 Doc 的聚合根的直接引用(根据我的假设,Doc 实体的聚合根 id ).这也将允许两个 Related entity 引用两个具有相同 ReportDate 的不同 Doc,这可能是也可能不是您所在领域的要求(请咨询领域专家)。

无论如何,两个聚合之间的隐式引用现在是显式的,并且 ReportDate 只需要存储在有意义的地方(在 DocRelated entity 上),或者仍然在两者上,如果它在域中是正确的(尽管,这可能意味着 Doc.ReportDate 不是 Related entity.ReportDate,例如 Doc.FiledDateRelated entity.ReportedDate ).

然后,当您希望删除 Doc 实体时,您必须跨多个聚合进行验证。这种类型的验证通常最好放在域服务中,它可以访问包含 Doc 实体和 Related entity 实体的存储库,并决定是否实际删除 [=11] =] 基于它是否找到任何相关的 Related entity 来限制 Doc 被删除(例如,匹配 ReportDate 或对聚合根 Doc 的引用)。

有关 validation/operation 结果报告的更多详细信息,请参见 here