Domain driven design CQRS/EventStore-如果命令不应失败,如何管理大型树?

Domain driven design CQRS/EventStore-如果命令不应失败,如何管理大型树?,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我读到CQR中的命令设计为不会失败,并且本质上应该是异步的 在我的例子中,我有一个树(想想windows资源管理器),其中用户有表示视频内容位置的文件夹,每个子项都是一个视频/媒体文件。多个用户都可以在树的同一分支上工作,移动文件夹和文件(上传新文件、创建新文件夹以及删除文件/文件夹) 如果我忽略了命令的异步性质,我可以让第一个用户进行更改,并在第二个用户上引发异常,如果用户将视频移动到的文件夹不再存在。现在,第二个用户负责刷新其树的一部分,然后重新应用其更改 如果我的更改不被允许(即,我尝试将

我读到CQR中的命令设计为不会失败,并且本质上应该是异步的

在我的例子中,我有一个树(想想windows资源管理器),其中用户有表示视频内容位置的文件夹,每个子项都是一个视频/媒体文件。多个用户都可以在树的同一分支上工作,移动文件夹和文件(上传新文件、创建新文件夹以及删除文件/文件夹)

如果我忽略了命令的异步性质,我可以让第一个用户进行更改,并在第二个用户上引发异常,如果用户将视频移动到的文件夹不再存在。现在,第二个用户负责刷新其树的一部分,然后重新应用其更改


如果我的更改不被允许(即,我尝试将视频文件移动到另一个文件夹,而另一个用户已删除该文件夹或将其移动到其他位置),我将如何使用CQRS进行此操作?当您将其发送到域时,您的命令应该是有效的。因此,在发送之前,您必须在客户机上验证它,以了解该文件夹是否仍在此处。它允许您通过一条清晰的错误消息准确地告诉客户端正在发生什么

这也大大降低了错误率。出现故障的时间范围缩短为通过网络发送命令的时间和在服务器上执行命令的时间

  • 如果风险真的很低。我们可能只会收到一个失败的命令 来自域的答案(例如:枚举)。对于用户来说,它可能会以 通用异常消息,我们可以实现它的数据来显示他 事情不同了,他不能做他想做的事。 如果出现以下情况,此类百分比较低的消息不应该是一个大问题: 我估计一年中只发生2-3次

  • 如果这种风险真的很高,或者无法从 但是客户端必须只出现在域端,那么我没有 现在就给你答案。我自己在学习CQRS,我 不能再说了

希望有帮助

[编辑]

我假设命令处理不是异步的。如果是这样的话,我会尝试在命令执行期间捕获任何异常,并且我可以返回一些失败通知,而无需向客户机说明它到底是什么。到各种readmodel的投影保持异步

 public void Handle(ICommand command)
        {
            try
            {
                CommandService.Execute(command);

                Bus.Return(ErrorCodes.None);
            }
            catch (Exception e)
            {
                Bus.Return(ErrorCodes.Fail);
            }
        }
我的CommandServiceDelegate有权执行此任务:

Public class TheGoodExecutor{
      protected void Execute(IUOW context, MyCommand command)
        {
            var myDomainObject= context.GetById<DomainObjecType>(command.Id);

            myDomainObject.DoStuff(Command.Data);

            // Accept all the work we just did.
            context.Accept();
        }
}
公共类TheGood Executor{
受保护的void执行(IUOW上下文,MyCommand命令)
{
var myDomainObject=context.GetById(command.Id);
DoStuff(Command.Data);
//接受我们刚刚做的所有工作。
Accept();
}
}
如果好的执行器出错,则返回总线(ErrorCodes.Fail)

我的客户机可以同步或异步地接收这些信息

如果您希望完全异步(这就是我正在尝试做的,或者至少我希望以这种方式进行探索),我会尝试订阅客户机可能感兴趣的事件。 对于验证,我认为,在大多数情况下,倾听事件没有多大意义。但在第二种情况下,我说的是,它可能会。在其他情况下,除了验证,它也可能

斜体的所有内容都是一些个人试用,我没有读到任何关于它的内容,也没有完成任何正常工作的内容。所以用大括号来表示。。呵呵


[/Edit]

当您将命令发送到域时,您的命令应该是有效的。因此,在发送之前,您必须在客户机上验证它,以了解该文件夹是否仍在此处。它允许您通过一条清晰的错误消息准确地告诉客户端正在发生什么

这也大大降低了错误率。出现故障的时间范围缩短为通过网络发送命令的时间和在服务器上执行命令的时间

  • 如果风险真的很低。我们可能只会收到一个失败的命令 来自域的答案(例如:枚举)。对于用户来说,它可能会以 通用异常消息,我们可以实现它的数据来显示他 事情不同了,他不能做他想做的事。 如果出现以下情况,此类百分比较低的消息不应该是一个大问题: 我估计一年中只发生2-3次

  • 如果这种风险真的很高,或者无法从 但是客户端必须只出现在域端,那么我没有 现在就给你答案。我自己在学习CQRS,我 不能再说了

希望有帮助

[编辑]

我假设命令处理不是异步的。如果是这样的话,我会尝试在命令执行期间捕获任何异常,并且我可以返回一些失败通知,而无需向客户机说明它到底是什么。到各种readmodel的投影保持异步

 public void Handle(ICommand command)
        {
            try
            {
                CommandService.Execute(command);

                Bus.Return(ErrorCodes.None);
            }
            catch (Exception e)
            {
                Bus.Return(ErrorCodes.Fail);
            }
        }
我的CommandServiceDelegate有权执行此任务:

Public class TheGoodExecutor{
      protected void Execute(IUOW context, MyCommand command)
        {
            var myDomainObject= context.GetById<DomainObjecType>(command.Id);

            myDomainObject.DoStuff(Command.Data);

            // Accept all the work we just did.
            context.Accept();
        }
}
公共类TheGood Executor{
受保护的void执行(IUOW上下文,MyCommand命令)
{
var myDomainObject=context.GetById(command.Id);
DoStuff(Command.Data);
//接受我们刚刚做的所有工作。
Accept();
}
}
如果好的执行器出错,则返回总线(ErrorCodes.Fail)

我的客户机可以同步或异步地接收这些信息

如果您希望完全异步(这就是我正在尝试做的,或者至少我希望以这种方式进行探索),我会尝试订阅客户机可能感兴趣的事件。 对于验证,我认为,在大多数情况下,倾听事件没有多大意义。但在第二种情况下,我说的是,它可能会。在其他情况下,除了验证,它也可能

我的一切