当前位置: 首页 > 知识库问答 >
问题:

验证联系人在Axon中有唯一的电子邮件

钱星华
2023-03-14

我很想知道,当使用Axon框架来验证一个电子邮件字段对于联系人聚合的一组电子邮件是唯一的时,最佳实践方法是什么。

示例设置

ContactCreateCommand {
   identifier = '123'
   name = 'ABC'
   email = 'info@abc.com'
}

ContactAggregate {
   ContactAggregate(ContactCreateCommand cmd) {
      //1. cannot validate email
      AggregateLifecycle.apply(
                new ContactCreatedEvent(//fields ... );
        );
   }
}
    null

2.在单独的持久层中进行验证

这种方法引入了一个新的持久层,它将验证聚合内部的唯一性。

在ContactCreateCommand的ContactAggregate命令处理程序中,我们可以针对这个持久层发出一个查询(例如,postgres中的一个表,上面有唯一的索引),我们可以针对这个包含所有集合的数据库验证电子邮件

    null

3.使用Saga和Singleton聚合

这种方法通过引入一个最多只能有1个实例的聚合(例如,目标标识符总是相同)来增强前面的设置。通过这种方式,我们创建了一个“单例聚合”,它只负责封装所有联系人电子邮件地址集。

ContactEmailValidateCommand {
   identifier = 'SINGLETON_ID_1'
   email='info@abc.com'
   customerIdentifier = '123'
}
UniqueContactEmailAggregate {
   @AggregateIdentifier
   private String identifier;

   Set<String> email = new HashSet<>();
   
   on(ContactEmailValidateCommand cmd) {
     if (email.contains(cmd.email) == false) {
       AggregateLifecycle.apply(
                new ContactEmailInvalidatedEvent(//fields ... );
     } else {
       AggregateLifecycle.apply(
                new ContactEmailValidatedEvent(//fields ... );
        );
     } 
   } 
   
}

完成此检查后,我们可以适当地重新操作ContactEmailInvalidatedEvent或ContactEmailValidatedEvent,这可能会在之后使联系人无效。

  • 相当多的锅炉板要取代“创建唯一索引”
  • 此方法允许“无效”联系人永远污染事件存储
  • “单例聚合”很复杂,以确保它是真的(也许有更简单或更好的方法)
  • CreateContactCommand的“调用程序”必须检查以查看SAGA的结果

别人怎么解决这个问题?我觉得选择2也许是最简单的方法,但还有其他选择吗?

共有1个答案

戚良弼
2023-03-14

您本质上寻找的是基于集合的验证(我认为这里的博客很好地解释了这个概念,以及如何在Axon中处理它)。简而言之,验证某个字段是否包含在一组数据中。在执行CQRS时,这成为一个有点有趣的概念,有几个解决方案(正如您已经描述的)。

我认为最好的解决方案总结在您的第二个选项下,即为电子邮件地址使用专用的持久层。您只需创建一个只包含电子邮件地址的非常简洁的模型,在发出ContactCreateCommand之前对其进行验证。注意,这个持久层属于命令模型,因为它用于执行业务验证。因此,您将介绍一个示例,在该示例中,您不仅在命令模型中有聚合,而且还有视图。正如您正确地指出的,这个视图当然需要针对它的用例进行优化。也许引入一个在应用程序启动时创建的缓存并不坏。

为了确保这个电子邮件地址视图尽可能是最新的,最明智的做法是确保它在发布ContactCreatedEvent(我假设它包含一个新的电子邮件地址)时的同一事务中更新。您可以通过为“电子邮件地址视图”设置一个专用的事件处理组件来做到这一点,该组件通过subscribingEventProcessor(a.SEP)进行更新。当发布事件(聚合)的同一线程调用SEP时,这将起作用。

这是我对这种情况的两分钱,希望这对@Vcetinick有帮助!

 类似资料:
  • 我是grails新手,正在用grails开发一个web应用程序。 在我的注册页面中,我正在获取用户的电子邮件ID,并且我需要发送带有身份验证链接的邮件。 http://grails.org/plugin/mail http://grails.org/plugin/email-confirmation 我参考了这些网页和许多其他网页来完成这项任务。但问题是,我的电子邮件没有发送。 我使用过 邮件设置

  • 我正在尝试更新一个用户,作为管理员。 我正在更改用户名,但上面说电子邮件必须是唯一的。 我该怎么解决这个问题。 这是请求类 我一直收到失败的电子邮件验证。电子邮件已经被拿走了。有什么想法吗

  • 我正在使用Firebase的方法来验证电子邮件。以下是代码: 这里,< code>else代码应该只在电子邮件未经验证时运行。但是,即使在我验证了电子邮件并重新开始活动之后,< code>if语句仍不为< code>true,电子邮件将再次发送。

  • 一旦在Cognito中验证,您如何在SES中验证电子邮件?预期行为是当用户通过Cognito注册时,他们会收到验证电子邮件。点击验证链接后,用户将在认知和SES中进行验证。 如果我能用SNS做同样的事情,我会很高兴 对感兴趣的人更新,我在沙盒下有我的SES帐户。当然,在制作过程中,我可以向我的Cognito用户池发送电子邮件,要求他们在SES中再次注册

  • 我正在提示我的应用程序用户提供电子邮件凭据。 在用户插入电子邮件并通过后,我想验证该帐户。 我正在使用javax。邮政有没有办法验证帐户?只确保凭据确实有效——否则我想显示一个无效用户并传递消息。 也许是某种表演方式: 并在不发送任何内容的情况下检查身份验证异常。

  • 问题内容: 我想在我正在创建的网站上使用联系表格,但是PHP不是一个选择,因为客户端不希望使用它。是否有一种聪明的方法可以解决此问题,例如发送电子邮件参数(非标准参数)或使用外部联系表?是否有一些不使用广告且可以轻松修改为其他语言的好产品? 谢谢。 问题答案: 联系人表单有数百种可嵌入(最可能基于)的解决方案,使您能够使用PHP等服务器端语言来解决问题。只是一个快速的谷歌搜索会给你一些。 或者,您