删除一个实体取决于许多标准

本文关键字:实体 取决于 许多 标准 一个 删除 | 更新日期: 2023-09-27 17:49:45

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

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

删除一个实体需要30个以上的标准吗?非常感谢任何示例代码或项目。

删除一个实体取决于许多标准

我想答案基本上是"取决于"。

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

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

在执行任何实体的删除时,您可以检查域服务中的交叉聚合条件,如果发现任何阻止删除DocRelated 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. 没有Doc实体/聚合,Related entity就不可能存在

在我看来,你在Related entityDoc之间有一个隐含的引用,即对于每个Related entity.ReportDate必须存在一个等于ReportDateDoc

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

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

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

有关验证/操作结果报告的更多详细信息,请点击此处。