Я читал, что люди используют библиотеки диспетчеризации событий для доменных событий в своем доменном дизайне.
В языке C # есть встроенная поддержка событий с использованием event
ключевое слово вместе с классом EventHandler<>
. Можно ли использовать это вместо библиотеки диспетчера событий (например, MediatR )?
Я знаю, что доменные события часто отправляются при сохранении, а не при вызове метода в агрегате,Но, добавив события в List<Action>
, вы можете отложить возникновение событий.
Объявление события:
public event EventHandler<InvoiceCreatedEventArgs> InvoiceCreated;
Отложенное поднятие события:
private ICollection<Action> _events = new List<Action>();
public void AddDomainEvent(Action action)
{
_events.Add(action);
}
protected virtual void OnInvoiceCreated(InvoiceCreatedEventArgs e)
{
AddDomainEvent(() => { InvoiceCreated?.Invoke(this, e); });
}
Еслисобытия представляются как открытые члены корневого агрегата, тогда приложение должно будет повторно подписываться для каждого нового экземпляра корневого агрегата всякий раз, когда корневое агрегатное устройство извлекается из хранилища.
Не будет ли это немногонежелательная черта для повторной подписки на каждый случай? Будет ли приложение отписываться тоже?
Если события не были объявлены как static
, но я слышал плохие вещи о статических событиях и утечках памяти. Будет ли это проблемой?
Если бы использовались события C #, они принадлежали бы к корневому агрегату или принадлежали бы в хранилище?
Если бы события были объявлены в хранилище (что моглобудет Entity Framework Core DbContext
), тогда при регистрации обработчиком зависимостей ASP.NET Core с использованием метода .AddDbContext
он будет зарегистрирован с временем жизни " Scoped " (один раз на запрос клиента), поэтомуесли события не должны были быть объявлены как статические, тогда приложение должно было бы повторно подписываться на каждый новый экземпляр репозитория, который происходил бы при каждом новом входящем HTTP-запросе.
Использует события C # для событий домена в приложении, использующемВозможен ли дизайн, управляемый предметной областью, или это нежизнеспособная злополучная идея?