我们有一个Doc实体,它有一个名为ReportDate的属性。当用户决定删除文档时,我们应该检查30个条件。这些条件类似:我们检查30个实体的ReportDate属性不等于Doc的ReportDate
这对我来说就像一股气味。每次我们添加新的实体时,我们都应该注意添加新的条件来删除文档。
删除一个实体需要30个以上的标准吗?非常感谢任何示例代码或项目。
我想答案基本上是"取决于"。
在领域驱动设计(DDD(中,我们努力基于对我们工作的领域中实际发生的事情以及我们开发的应用程序将如何解决业务问题的共同理解来对领域进行建模。
如果在域中,实际上有30多个对Doc
的引用(隐式或显式,请参阅下文(,那么是的,在删除Doc
实体之前检查这30多个引用是正确的。如果这些参考文献是不是来自领域专家的实现细节的结果,那么不,检查这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);
}
}
我想分享我在阅读这个问题时想到的一些想法,但首先是一些假设:
Doc
是聚合根Related entity
是另一个集合中的实体- 没有
Doc
实体/聚合,Related entity
就不可能存在
在我看来,你在Related entity
和Doc
之间有一个隐含的引用,即对于每个Related entity.ReportDate
,必须存在一个等于ReportDate
的Doc
。
我认为这种关系应该更明确,而是添加对保存Doc
的聚合根的直接引用(基于我的假设,Doc
实体的聚合根id(。这也将允许两个Related entity
引用具有相同ReportDate
的两个不同Doc
,这可能是您所在领域的要求,也可能不是(请咨询领域专家(。
无论哪种方式,两个聚合之间的隐式引用现在都是显式的,并且ReportDate
只需要存储在它有意义的地方(在Doc
或Related entity
上(,或者仍然存储在两者上,如果它是域中正确的东西(不过,这可能意味着Doc.ReportDate
不是Related entity.ReportDate
,例如Doc.FiledDate
和Related entity.ReportedDate
(。
然后,当您希望删除Doc
实体时,您必须跨多个聚合进行验证。这种类型的验证通常最好放在可以访问包含Doc
实体和Related entity
实体的存储库的域服务中,并且基于是否发现任何限制Doc
被删除的相关Related entity
s(例如匹配ReportDate
或对聚合根Doc
的引用(来决定是否实际删除Doc
。
有关验证/操作结果报告的更多详细信息,请点击此处。