Исходя из этого, события домена могут отправляться до или после сохранения изменений.
Код: Выделить всё
public class OrderingContext : DbContext, IUnitOfWork
{
// ...
public async Task SaveEntitiesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
// Dispatch Domain Events collection.
// Choices:
// A) Right BEFORE committing data (EF SaveChanges) into the DB. This makes
// a single transaction including side effects from the domain event
// handlers that are using the same DbContext with Scope lifetime
// B) Right AFTER committing data (EF SaveChanges) into the DB. This makes
// multiple transactions. You will need to handle eventual consistency and
// compensatory actions in case of failures.
await _mediator.DispatchDomainEventsAsync(this);
// After this line runs, all the changes (from the Command Handler and Domain
// event handlers) performed through the DbContext will be committed
var result = await base.SaveChangesAsync();
}
}
Я хотел бы иметь два разных события: «Удалено» и «Создано».Я написал простой класс с двумя методами
Код: Выделить всё
public class XEntity
{
private XEntity() {}
public static XEntity Create()
{
...
var x = new XEntity();
x.RaiseDomainEvent(new XCreatedDomainEvent(x.Id));
}
public void Delete()
{
RaiseDomainEvent(new XDeletedDomainEvent(Id));
}
}
Код: Выделить всё
public class XCreatedDomainEventHandler(IXRepository repo) : INotificationHandler
{
public async Task Handle(XCreatedDomainEvent notification, CancellationToken ctk)
{
var x = await repo.GetById(notification.Id);
.....
}
}
Если я помещу код, который отправляет DomainEvents ДО сохранения изменений, конечно, обработчик не сможет получить уже созданное задание из репо, потому что разве это не в БД (поскольку изменения еще не произошли).
Но если я помещу код, который отправляет DomainEvents ПОСЛЕ сохранения изменений, я не смогу отправлять удаленные события, поскольку объекты уже были удалены EF ChangeTraker. Это код, который я использую для получения событий
Код: Выделить всё
private async Task PublishDomainEventsAsync()
{
var domainEvents = ChangeTracker
.Entries()
.Select(entry => entry.Entity)
.SelectMany(entity =>
{
var domainEvents = entity.GetDomainEvents();
entity.ClearDomainEvents();
return domainEvents;
})
.ToList();
... dispatch ...
}
Любая помощь приветствуется
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/792 ... avechanges