Цепные модификации в событиях - PullRequest
0 голосов
/ 30 ноября 2018

ASP.NET Boilerplate имеет систему EventBus , и у нас есть события

  • EntityCreatingEventData
  • EntityCreatedEventData
  • EntityDeletingEventData
  • EntityDeletedEventData

Но эти события работают после вызова SaveChanges() (данные уже в БД),Нам нужна система событий перед вызовом SaveChanges(), когда данные еще не записаны в БД

Нам также нужна рекурсивная система событий, например:

создание объекта A => вызов EntityCreatingBeforeSaveEventData (a)=> в этом дескрипторе мы создаем новый объект B и вызываем Repository.Insert (b) => вызываем EntityCreatingBeforeSaveEventData (b) ... И этот процесс вызывает пока существующую любую модификацию в контексте БД.

1 Ответ

0 голосов
/ 01 декабря 2018

Зависит от entity.Id

Невозможно создать систему событий домена перед вызовом SaveChanges().

  • ASP.NET Boilerplate обнаруживает изменения при вызов SaveChanges().
  • Рекурсивные события могут вызвать бесконечный цикл - см. # 1616 .
  • Объект с Id, который не был установлен (автоматически сгенерированный) не может быть идентифицирован.

Если вы зависите от такой системы, то это может быть плохое разделение интересов.

Независимо от entity.Id

Вы можете использовать IEventBus напрямую.

Триггерное событие:

public class AManager : DomainService, IAManager
{
    public void CreateA()
    {
        var a = new A();
        Repository.Insert(a);
        EventBus.Trigger(new EntityCreatingBeforeSaveEventData<A>
        {
             Property = a.SomeProperty // Can pass other properties
        });
    }
}

public class BManager : DomainService, IBManager
{
    // Similar to above
}

Обрабатывать событие:

public class AHandler : IEventHandler<EntityCreatingBeforeSaveEventData<A>>, ITransientDependency
{
    public IBManager BManager { get; set; }

    public void HandleEvent(EntityCreatingBeforeSaveEventData<A> eventData)
    {
        var aSomeProperty = eventData.Property;
        BManager.CreateB();
    }
}
...