【问题标题】:Is there a elegant way of putting domain validations inside domain layer?有没有一种优雅的方式将域验证放在域层中?
【发布时间】:2020-04-14 03:28:38
【问题描述】:

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

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

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

困扰我的事情。

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

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

解决此问题的初步想法。

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

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

【问题讨论】:

    标签: validation domain-driven-design domain-model rich-domain-model


    【解决方案1】:

    是否有任何明确的方法可以在域模型中处理域验证?

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

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

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

    根据您的域和可用信息,可能存在表示客户无法获得所需信息的状态。 “少有人走的路”并不意味着事情是无效

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

    【讨论】:

    • 我了解消息验证与域验证是分开的,但我对域验证感到困惑。如果我们想在域内执行验证,则应该聚合读取域操作和验证所需的所有子实体。域层是否应该有权访问数据库,以便验证将读取数据并独立验证它,这样我们就不必传递聚合并考虑验证需要什么?要说的一件重要的事情,我现在正在我的应用程序层中读取聚合,也许这是错误的?
    • 我读过你的answer,因为行为而不是结构,应该阅读完整的聚合,我理解你所说的关于状态的内容。感谢您的时间和回答,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多