【发布时间】:2019-07-25 19:44:49
【问题描述】:
发生了什么
我正在开发使用一次性密码处理操作确认的内部微服务。我决定创建良好的域模型使用事件溯源方法。
我有什么
我为某个操作类型的操作有确认会话。用户可以为 Confirmation Attempt 添加询问 Session 并指定他想要接收 Challenge 的Channel(一个-时间密码)。 Channel 类似于 SMS、E-Mail、Push 等。
这是命令处理程序的代码摘录
var session = _sessionFactory.CreateSession(operationType, userId);
var challengeCreationResult = await _challengeProvider.CreateAsync(
recipient, channelType, session, addOnFields);
if (!challengeCreationResult.IsSuccess)
{
return OperationResult<AttemptCreationResult>.Error(
challengeCreationResult.ErrorCode, challengeCreationResult.ErrorMessage);
}
session.AddAttempt(challengeCreationResult.Data);
在创建确认尝试并收到挑战之后,用户可以提交他的响应以进行验证。
var session = await _sessionStore.GetAsync(sessionId);
var result = await session.ApplyResponseAsync(response, _responseValidator, actingUserId, operationType);
AddAttempt 和ApplyResponseAsync 都会触发相应的事件,并将操作结果返回给用户。
出了什么问题
在我尝试添加需要了解多个确认会话的业务规则之前,我对此实现感到满意。它们是:
- 如果用户在一小时内对单个操作类型给出了五个错误的答案,我们需要冻结他一小时。
- 如果自上次 Confirmation Attempt 后 30 秒没有正确答案,用户只能请求新的 Confirmation Attempt。
问题
如何在保持聚合根/服务/事件处理程序小而专注的同时实施这些规则?
【问题讨论】:
标签: c# domain-driven-design cqrs event-sourcing