Design patterns CommandHandler和EventHandler顺序

Design patterns CommandHandler和EventHandler顺序,design-patterns,domain-driven-design,cqrs,command-pattern,ddd,Design Patterns,Domain Driven Design,Cqrs,Command Pattern,Ddd,我是CQR的新手,希望了解该模式的工作顺序。我的命令处理程序和命令如下: public interface ICommandHandler<in TCommand> where TCommand : ICommand { void Handle(TCommand command); } 我想发送电子邮件,发送短信和其他工作后创建的东西。但是我不能在Handle(CreateWork命令)中执行这些步骤,因为分离的体系结构 我认为这些步骤都是事件,这是真的吗?所以我需要事件和

我是CQR的新手,希望了解该模式的工作顺序。我的命令处理程序和命令如下:

public interface ICommandHandler<in TCommand> where TCommand : ICommand
{
    void Handle(TCommand command);
}
我想发送电子邮件,发送短信和其他工作后创建的东西。但是我不能在
Handle(CreateWork命令)
中执行这些步骤,因为分离的体系结构

我认为这些步骤都是事件,这是真的吗?所以我需要
事件
事件处理程序
类型

public interface IEventHandler<in TEvent> where TEvent : IEvent
{
    void Handle(TEvent event);
}
公共接口IEventHandler,其中TEvent:IEvent
{
无效句柄(TEvent事件);
}
在哪里可以填充事件?在CommandExecuterCommandHandler中,一个事件需要多个事件。例如:

创建的公共类:IEvent{}

发送短信,发送电子邮件

        foreach (var handler in handlers)
        ((dynamic)handler).Handle((dynamic)command);
那看起来很奇怪。为什么在/上下文中,一个命令会有多个处理程序

对于事件消息,这种模式是有意义的;事件具有零个或多个订阅者是正常的。但命令是发送给特定目标的消息,因此枚举一些处理程序似乎很奇怪

关于你的问题

我想发送电子邮件,发送短信和其他工作后创建的东西。但是我不能在Handle(CreateWork命令)中执行这些步骤,因为分离的体系结构

我认为这些步骤都是事件,这是真的吗

事件是描述过去发生的事情的消息。听起来像是火柴吗?在我看来,你是在描述一个命令——你想要某个系统为你发送电子邮件。这听起来不像是已经发生的事情

EmailCommandSuccessed、SMSCommandFailed等等更详细的信息——这些都是事件;过去发生的事情

在中,命令是更改域状态的建议(前提是域模型实施的业务不变量允许更改)。模型的响应通常分为两部分;提交事务时要保留的数据(Repository.save()),以及要与世界其他地方共享的消息。这些消息可以是域事件,也可以是要在其他事务/上下文中运行的命令

因此,对于您的问题,通常的答案是,命令处理程序将把命令交给域模型,并返回要调度的命令列表(在事务上下文之外)

如果命令处理程序无法直接执行此操作,另一种方法可能是发布EmailCommandScheduledEvent,然后让事件处理程序执行相同的工作

那看起来很奇怪。为什么在/上下文中,一个命令会有多个处理程序

对于事件消息,这种模式是有意义的;事件具有零个或多个订阅者是正常的。但命令是发送给特定目标的消息,因此枚举一些处理程序似乎很奇怪

关于你的问题

我想发送电子邮件,发送短信和其他工作后创建的东西。但是我不能在Handle(CreateWork命令)中执行这些步骤,因为分离的体系结构

我认为这些步骤都是事件,这是真的吗

事件是描述过去发生的事情的消息。听起来像是火柴吗?在我看来,你是在描述一个命令——你想要某个系统为你发送电子邮件。这听起来不像是已经发生的事情

EmailCommandSuccessed、SMSCommandFailed等等更详细的信息——这些都是事件;过去发生的事情

在中,命令是更改域状态的建议(前提是域模型实施的业务不变量允许更改)。模型的响应通常分为两部分;提交事务时要保留的数据(Repository.save()),以及要与世界其他地方共享的消息。这些消息可以是域事件,也可以是要在其他事务/上下文中运行的命令

因此,对于您的问题,通常的答案是,命令处理程序将把命令交给域模型,并返回要调度的命令列表(在事务上下文之外)


如果命令处理程序无法直接执行此操作,另一种方法可能是发布EmailCommandScheduledEvent,然后让事件处理程序执行相同的工作。

我同意foreach不适合处理程序。最好使用handlers.single()来确保命令只有一个处理程序。我同意foreach不适合处理程序。最好执行handlers.single()以确保该命令只有一个处理程序。
public interface IEventHandler<in TEvent> where TEvent : IEvent
{
    void Handle(TEvent event);
}
        foreach (var handler in handlers)
        ((dynamic)handler).Handle((dynamic)command);