模型层中的域驱动设计数据库验证

问题描述 投票:0回答:1

我正在为Twitter应用创建设计以练习DDD。我的域模型如下所示:Domain UML

用户和推文被标记为蓝色,以指示它们是聚合根。在用户和tweet之间,我想要一个有限的上下文,每个都将在各自的微服务(auth和tweet)中运行。为了引用哪个用户创建了一条推文,但没有遇到自引用循环,我创建了UserInfo对象。创建新用户时,将通过事件创建UserInfo对象。它仅存储Tweet微服务将需要的用户信息。

[创建推文时,我仅向该推文提供用户ID和相关字段,使用该用户ID,我希望能够通过ID引用检索UserInfo对象,以便在各种子对象(例如Mentions)中使用它和海报。

我遇到的问题是持久性,乍一看,我以为“只要在tweet构造函数中提供UserInfo对象,它就完成了,所有子聚合都可以访问它”。但这在Mention类上有点困难,因为Mention将包含一个动态用户名,例如:“ @ anyuser”。为了验证是否有任何用户作为UserInfo对象存在,我需要查询数据库。但是,在解析tweet的内容之前,我不知道提到谁,并且该逻辑驻留在域模型本身中,并且由于使用tweets构造函数而被调用。如果没有这种逻辑,就不会提取任何提及,因此“尚未”得到验证。

如果在创建推文之前无法验证它,因为我需要提取逻辑,并且无法在域模型层内部使用数据库存储库,那么如何正确验证提及?

database uml domain-driven-design modeling
1个回答
0
投票

    您将服务传递给AR的方法,该方法可以执行解析。服务接口在域中定义,但很可能在基础结构层中实现。
  1. 例如someAr.someMethod(args, someServiceImpl)

    注意,如果在构造时需要数据,则可能需要引入一个依赖服务接口的工厂,执行验证并返回AR的实例。

    例如

    tweetFactory = new TweetFactory(new SqlUserInfoLookupService(...)); tweet = tweetFactory.create(...);

  2. 您首先在应用程序层中解决依赖关系,然后传递所需的数据。注意,应用程序层可能会依赖域服务,以便首先执行一些反向解析。
  3. 例如

    如果应用程序层希望为所有提及都解决UserInfo,但是不能这样做,因为它不知道如何在文本中解析提及,它可以始终依靠域服务或值对象来执行该任务首先,然后解析UserInfo依赖项并将其提供给Tweet AR。

最后,请注意,任何在AR边界之外验证的数据始终被认为是陈旧的。发送推文1毫秒后,@xyz用户当前可能存在,但不再存在(例如,已停用)。

© www.soinside.com 2019 - 2024. All rights reserved.