Я прочитал события поднятия домена, как описано Уди Даханом http://udidahan.com/2009/06/14/domain-events-salvation/. Я создал необходимые интерфейсы и события, но я пытаюсь зарегистрировать свои события / обработчики в классе DomainEvents.
Класс DomainEvents использует либо метод Register (), либо вы можете предоставить экземпляр IContainer.
Я зарегистрировал событие в DI-контейнере .NET Cores по умолчанию в моем файле запуска, используя
services.AddScoped<IEventHandler<TicketWasClosedEvent>, TicketWasClosedEventHandler>();
Далее, я думаю, мне нужно сделать две вещи;
- Получить экземпляр ICollection из DI-контейнера .NET Cores, чтобы я мог передать его в класс DomainEvents.
- Измените метод Raise () в примере Udi Dahans, поскольку он использует метод ResolveAll () в IContainer, который в .NET Core, по-видимому, недоступен.
Вот копия класса DomainEvents для сохранения по ссылке выше;
public class DomainEvents
{
[ThreadStatic] //so that each thread has its own callbacks
private static List<Delegate> Actions;
public static IContainer Container { get; set; }
public static void Register<T>(Action<T> callback) where T : IDomainEvent
{
if (Actions == null)
{
Actions = new List<Delegate>();
}
Actions.Add(callback);
}
public static void ClearCallbacks()
{
Actions = null;
}
public static void Raise<T>(T args) where T : IDomainEvent
{
if (Actions != null)
{
if (Container != null)
{
foreach (var handler in Container.ResolveAll<EventHandler<T>>) // ResolveAll doesn't exist on IContainer
{
handler.Handle(args);
}
}
foreach (var action in Actions)
{
if (action is Action<T>)
{
((Action<T>) action)(args);
}
}
}
}
}