Регистрация обработчиков событий в ASP.NET Core на примере событий Udi Dahan - PullRequest
1 голос
/ 16 мая 2019

Я прочитал события поднятия домена, как описано Уди Даханом http://udidahan.com/2009/06/14/domain-events-salvation/. Я создал необходимые интерфейсы и события, но я пытаюсь зарегистрировать свои события / обработчики в классе DomainEvents.

Класс DomainEvents использует либо метод Register (), либо вы можете предоставить экземпляр IContainer.

Я зарегистрировал событие в DI-контейнере .NET Cores по умолчанию в моем файле запуска, используя

services.AddScoped<IEventHandler<TicketWasClosedEvent>, TicketWasClosedEventHandler>();

Далее, я думаю, мне нужно сделать две вещи;

  1. Получить экземпляр ICollection из DI-контейнера .NET Cores, чтобы я мог передать его в класс DomainEvents.
  2. Измените метод 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);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...