事件处理人员是否应该开火并忘记

时间:2015-03-28 09:33:32

标签: domain-driven-design cqrs

处理程序处理命令操作后,我引发了域事件。在某些情况下,事件处理程序失败是可以容忍的。我可以说大多数情况都是如此,我希望所有的事件处理程序都是容错的。

如果事件处理程序失败,或者事件处理程序是否会被触发并忘记,我的操作是否会失败?

例如,假设这是我举起事件的地方,正如您所看到的,eventHandler.Execute的潜在异常未得到处理。

public void Publish<TEvent>(TEvent @event) where TEvent : IDomainEvent
{
    IEnumerable<IEventHandler<TEvent>> handlers = _lifetimeScope.GetService<IEnumerable<IEventHandler<TEvent>>>();
    var eventHandlers = handlers as IEventHandler<TEvent>[] ?? handlers.ToArray();
    if (eventHandlers.Any())
    {
        foreach (IEventHandler<TEvent> eventHandler in eventHandlers)
        {
            eventHandler.Execute(@event);
        }
    }
    else
    {
        throw new InvalidOperationException("No handler registered");
    }
}

然而,我的愿望是拥有如下内容:

public void Publish<TEvent>(TEvent @event) where TEvent : IDomainEvent
{
    IEnumerable<IEventHandler<TEvent>> handlers = _lifetimeScope.GetService<IEnumerable<IEventHandler<TEvent>>>();
    var eventHandlers = handlers as IEventHandler<TEvent>[] ?? handlers.ToArray();
    if (eventHandlers.Any())
    {
        foreach (IEventHandler<TEvent> eventHandler in eventHandlers)
        {
            try
            {
                eventHandler.Execute(@event);
            }
            catch (Exception ex)
            {
                // log the expection
                // swallow it
            }
        }
    }
    else
    {
        throw new InvalidOperationException("No handler registered");
    }
}

1 个答案:

答案 0 :(得分:4)

我通常将事件放在持久化的pub / sub系统上,然后从Command Handler返回。

这样,单个事件处理程序可能会在不影响主系统或相互影响的情况下发生故障。