axon es方式下,业务中出现唯一性验证一般如何处理?
来源:8-8 聚合命令事件(上)

慕粉1750262393
2018-08-10
如:注册过程中,要求账号名唯一,在event sourcing模式下如何处理好一些?引入一个校验唯一性的领域服务?还是利用saga,先创建一个注册流程的聚合,然后saga创建账号名的聚合,再创建一个账号的聚合,然后标记账号名状态为已占用,最后标记注册流程完成?哪种更合理一些?或者还有别的方法?
1回答
-
这个,其实最简单的方法是从业务上考虑,也就是在注册的时候,在页面上当用户输入用户名以后,发一个请求到服务器验证一下。如果说验证的时候这个用户名还不存在,但是因为几乎同时有2个人尝试用同一个名字注册,还是有可能出错,但是毕竟概率小,我们可以允许他出错并提示用户。
另一种方式是在一个CommandHandler里面判断,在我们的实例中,我没有演示使用独立的CommandHandler类,因为这种方式其实不太方便,需要自己配置这个bean。我们使用聚合对象上的CommandHandler方法的时候,是通过它的聚合id来创建或找到这个方法要操作的聚合数据。但是使用独立的CommandHandler类的时候,我们就可以自己根据需要获取聚合对象。
由于这里贴代码不太方便,我就说一下方法。首先定义一个CommandHandler类,然后在一个configuration类里面定义这个bean。然后在CommandHandler类里,注入userQueryRepository,也就是query数据库的用户Repository,然后在处理方法里,就能用这个userQueryRepository查看用户名是否存在,不存在的话。再出发相应的event,存在就返回。
然后,你说是否可以用saga,其实不需要,我们要做的,实际上就是在创建用户的command关联到相应的聚合对象之前,先判断一下。也就是上面说的方式。
012018-08-10
相似问题