将某些事件处理程序推迟到提交事务后进行?

时间:2019-04-21 13:18:11

标签: c# entity-framework-core mediatr

我在存储库中使用MediatR调度域事件。我的域层中的处理程序会产生副作用,需要在将数据添加到数据库之前对其进行处理,而我的应用程序层中的处理程序需要在提交后执行(即,将消息放入队列中或将电子邮件发送至客户)。

我遇到的问题是,开箱即用,所有处理程序将在执行之前或之后执行,但不能同时执行。有办法解决吗?

CommerceEntityFrameworkworkRepository.cs

public async Task Save(CancellationToken cancellationToken = default)
{
    var eventsPublished = _db.ChangeTracker
        .Entries<TAggregateRoot>()
        .Select(entry => entry.Entity)
        .ToList()
        .SelectMany(aggregate =>
        {
            var @events = aggregate.GetEvents();
            aggregate.ClearEvents();
            return events;
        })
        .Select(@event => _mediator.Publish(@event, cancellationToken))
        .ToList();

    await Task.WhenAll(eventsPublished);

    await _db.SaveChangesAsync(cancellationToken);
}

您可以在这里找到存储库:https://github.com/jakeam/MyShop

0 个答案:

没有答案