Design patterns CommandHandler和EventHandler顺序
我是CQR的新手,希望了解该模式的工作顺序。我的命令处理程序和命令如下: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命令)中执行这些步骤,因为分离的体系结构 我认为这些步骤都是事件,这是真的吗?所以我需要事件和
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事件);
}
在哪里可以填充事件?在CommandExecuter或CommandHandler中,一个事件需要多个事件。例如:
创建的公共类: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);