这可能有助于引用 Vaughn Vernon 的实施领域驱动设计。
“也许领域事件最常见的用途是当聚合创建事件并发布它时。发布者驻留在模型的模块中,但它不对某些方面进行建模。相反,它为聚合提供简单的服务,需要将事件通知订阅者。”
事件是使用服务发布的,处理程序的实现取决于模型其余部分最终保持一致的可接受时间。根据我的特殊要求,时间上的小延迟是可以接受的。我的域事件使用 MSMQ 发布到队列,然后在外部进程中我从队列中读取并执行工作。这种设计允许我将这项工作卸载到外部主机并释放 IIS。我使用相同的机制将更改持久保存到存储中。当我的聚合事务完成时,我将提交的事件发布到 MSMQ,并在多播上有 2 个队列。一个队列用于处理额外的工作,另一个用于持久性。
如果你还没有读过,我强烈推荐这本书。我相信我的设计会带来一些批评,但您的实现将取决于您的要求以及您对使用最终一致性的舒适程度。
希望这会有所帮助,如果您决定使用 MSMQ,这里有一个链接可以帮助您入门。
http://msdn.microsoft.com/en-us/library/aa480407.aspx
这是我对域事件发布者的实现。
public class DomainEventPublisher
{
string DomaineEventMessageQueue = @"FormatName:MULTICAST=234.1.1.1:8001";
public void PublishEvent(DomainEvent domainEvent, string correlationId)
{
MessageQueue eventQueue;
eventQueue = new MessageQueue(DomaineEventMessageQueue);
Message message = DomainEventMessage.CreateDomainEventMessage(domainEvent);
message.CorrelationId = correlationId;
eventQueue.Send(message);
}
}