【问题标题】:Removing an entity depends on many criterias删除实体取决于许多标准
【发布时间】:2015-05-19 09:50:11
【问题描述】:

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

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

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

【问题讨论】:

  • 如果我有误解,请纠正我,有一个通过 ReportDate 与 30 多个不同实体相关的 Doc,如果至少有另一个实体引用该 ReportDate,您不能删除 Doc?这些实体中是否有任何实体充当聚合根?是否有任何其他规则可以删除这些实体,例如。删除实体 X 会导致删除 Doc 实体?
  • @pwc: Doc.ReportDate 是一个日期时间属性。 30 多个相关实体中没有一个直接引用 Doc,但是有一个逻辑可以删除不应该存在任何 relatedEntitiy.ReportDate == Doc.ReportDate 的 Doc。对于某些相关实体,可能需要检查复杂的逻辑以了解用户是否可以删除 Doc。对于最后一个问题,相关实体不知道或不依赖于 Doc 实体,它们是独立的。

标签: c# architecture domain-driven-design software-design


【解决方案1】:

我猜答案基本上是“视情况而定”。

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

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

在删除任何实体时,可以检查域服务中的交叉聚合条件,如果发现有Related entity导致Doc无法被删除,则报告删除失败。

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

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必须存在一个Doc 和一个相等的ReportDate .

我认为这种关系应该更加明确,而是添加对包含 Doc 的聚合根的直接引用(基于我的假设,Doc 实体的聚合根 ID)。这也将允许两个Related entitys 使用相同的ReportDate 引用两个不同的Docs,这可能是您的域中的要求,也可能不是(询问领域专家)。

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

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

关于验证/操作结果报告的更多细节,可以找到here

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2019-02-11
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多