DomainEvent опубликован до/после EF SaveChangesC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 DomainEvent опубликован до/после EF SaveChanges

Сообщение Anonymous »

Я пытаюсь выяснить, как отправлять события в простом проекте, использующем EF Core.
Исходя из этого, события домена могут отправляться до или после сохранения изменений.

Код: Выделить всё

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();
}
}
Предположим, у нас есть простой контроллер CRUD, который позволяет работать с объектом X.
Я хотел бы иметь два разных события: «Удалено» и «Создано».Я написал простой класс с двумя методами

Код: Выделить всё

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));
}
}
А это простой CreatedDomainEventHandler

Код: Выделить всё

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 ...
}

Я вижу только два варианта: написать 2 разных метода для сохранения сущностей (DispatchAndSave и SaveAndDispatch), но мне не нравится такое решение, и еще один, в котором я получаю все сущности перед сохранением, чтобы получить события, сохраните, а затем отправьте события (но мне это тоже не нравится, потому что я хотел бы иметь один и тот же контекст базы данных для области всех событий перед сохранением, чтобы откатить все, если что-то пойдет неправильно)
Любая помощь приветствуется
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/792 ... avechanges
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Jinja2.Exceptions.TemplateSyntaxError: ожидаемый токен «конец оператора печати», «опубликован»
    Anonymous » » в форуме Python
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Где опубликован opentelemetry-javaagent-all.jar? [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Причина возвращаемого значения 0 в SaveChanges() в Entity Framework
    Anonymous » » в форуме C#
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • MSTest для context.SaveChanges();
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • EF Core — оркестрация перехватчиков/событий SavingChanges и SaveChanges для отслеживания измененных объектов после сохра
    Anonymous » » в форуме C#
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»