如何使用域驱动设计处理具有数据库查找验证的根聚合中的实体删除

本文关键字:验证 查找 删除 实体 数据库 何使用 处理 | 更新日期: 2023-09-27 17:54:00

假设我有一个实体,它代表一个用户可以用来创建文档的模板。用户可以输入一个给定的模式来插入占位符,例如{{占位符名称}},以便它可以用作其他文档的模板。

例如,如果用户输入"这是一个{{placeholder1}}字母,可以用于{{placeholder2}}或{{placeholder3}}.",那么这将创建一个模板实体,其中包含三个占位符,给出下面的伪代码。

class Template {
 int Id { get; set; }
 string Text { get; set; }
 IEnumerable<Placeholder> placeholders { get; set;}
}
class Placeholder {
 int Id { get; }
 string Name { get; }
}

当用户从模板创建文档时,他们不必使用所有占位符,因此模板创建者可以更新模板并删除未在任何文档中使用的占位符。

我试图理解使用DDD如何或在哪里我将实现模板文本的解析,以及我在哪里检查,看看是否在从模板派生的文档中使用了占位符。

我的想法是,对于上面给定的示例,模板编辑器用户可以将文本更新为"这是一个字母,可以用于{{placeholder2}}或{{placeholder3}}"。我需要解析文本并取出占位符,然后我需要去数据库查看丢失的占位符,即{{placehodler1}}是否已在任何派生文档中使用。

我不能得到我的头虽然是我假设我需要一个服务来检查数据库和验证新的文本。为此,它首先需要解析输入的文本并提取占位符,然后进行数据库检查。如果文本是有效的,那么我将在模板实体上设置文本属性,为了取出占位符,必须再次解析该属性,因此我在服务和实体中重复解析功能。

有没有人对在这种情况下工作的设计有任何想法,或者如何使用DDD最好地实现这一点?我是注入一个服务到模板实体中来完成这个任务,还是把实体传递给一个服务等等?

我只是想要一些顶级的设计建议,或者在正确的方向上点头。

问候,加里。

如何使用域驱动设计处理具有数据库查找验证的根聚合中的实体删除

这听起来像是应用程序服务(即TemplateManager或其他东西)的一个很好的候选者。应用程序服务将使用域服务(存储库等),并在解析模板后执行检查。您可以将域模型传递给域服务以执行读取,然后根据读取的返回值执行后续操作。