0

我是域驱动设计的新手,在编写域模型时有一件事困扰着我。如何处理域验证?

我正在设计图书馆管理系统,用户可以在其中搜索书籍并查看书籍是否在库存中。如果不是,用户可以创建图书请求,以便创建某种队列。规则是我们没有任何书存货。现在我有关于书籍实体内部数量的信息,这不是问题,但是如果我有不同的有界上下文来请求书籍和书籍目录怎么办。然后我必须以某种方式联系另一个垂直/服务并在创建书籍聚合之前询问(验证)书籍数量为零。

我也在检查用户是否有有效的会员卡,他是否已经借过书,用户是否有任何书的主动请求。

困扰我的事情。

由于验证,在将其传递给域模型之前,我需要知道究竟要包含什么。我不确定这是最安全的方法,因为我的验证准确性将取决于规范/查询等。

另一个非常重要的事情。当应用程序层方法开始执行并且某些内容无效时,客户端将仅获得已执行代码的验证消息,并且很有可能存在更多阻止代码执行的内容。如果用户正在填写一些表格,这可能真的很不方便。

解决这个问题的第一个想法。

我有命令/处理程序架构,并且我正在使用 MediatR,所以我正在考虑在命令和处理程序之间移动域验证,这将解决我现在的问题,但是这种方法将跨有界上下文传播域知识,并且域模型不够聪明防止无效的动作。更准确地说,我需要在执行应用程序方法(处理程序)之前考虑我需要验证的内容。

所以我真的很好奇。是否有任何明确的方法来处理域模型内的域验证?

4

1 回答 1

1

是否有任何明确的方法来处理域模型内的域验证?

是的; 他们需要工作和仔细思考。

仔细思考的一个方面是将消息验证与域逻辑区分开来。消息验证是一个孤立的事情,消息是否有效取决于消息的架构——是否存在所有必需的字段,数据是否正确,数字是否在允许的范围内,等等。真的,我们问的是“客户是否正确填写了表格?”

将有效消息与先前已知的信息(也称为域模型的“状态”)集成是域逻辑问题。状态是故意选择的——域模型一个状态机,用于记录你的域。

根据您的域和可用信息,可能存在表示客户没有得到他们想要的东西的状态。“少有人走的路”并不意味着事情是无效的。

此外,如果您的系统是分布式的(不同的数据由不同的机构负责),那么该数据的任何本地缓存副本必然是陈旧的,并且可能已过时。参见 Pat Helland 的回忆、猜测和道歉。我们有时会产生错误的答案是分发工作的必然结果。如果我们有责任,那么我们会进行成本收益分析,以确保分配工作的预期收益抵消预期风险。

于 2019-12-22T15:49:25.337 回答