По сути, я даже не знаю, где зарегистрировать обработчик событий в экземпляре контроллера, поскольку создание экземпляра выполняется контейнером DI, и я хотел бы зарегистрироваться во вновь созданном экземпляре контроллера.
Isэто даже целесообразно сделать, или есть лучший способ, который соответствует архитектуре ASP.NET Core?
Сценарий таков:Скрытая ссылка доступна для некоторого анонимного пользователя до истечения срока действия.
Первый вариант использования:
Любой анонимный пользователь может вручную «закрыть» ссылку (сделать ее недействительной / недоступной) с помощью вызова Web API дляметод контроллера.Этот метод может вызвать событие OnLinkClosed.
Второй вариант использования:
«Задание chron» проверяет таблицу базы данных скрытых ссылок и, если срок ее действия истек, она установит запись как «закрытая» (вместо пользователя).).Это может вызвать другую API-функцию (т. Е. Потому что теперь мы знаем, кто / что закрыл ссылку), но реакция на нее в основном одинакова.Это может вызвать событие OnLinkClosedByChronJob.
Реакция на OnLinkClosed, OnLinkClosedByChronJob:
- Данные ссылки в БД должны быть помечены как закрытые.
- Необходимо проверить некоторые данные, а первоначальный создатель (который не известен) скрытой ссылки должен быть проинформирован по электронной почте.
- (возможно, необходима трансляция SignalR.)
- (Возможно, некоторая статистика нуждается в обновлении.)
Я не хочу жестко кодировать всю эту (и более позднюю) функциональность в методе контроллера (чтобы избежать использования длинных методов контроллера, было бы одной проблемой).Может быть, я должен сделать это в службе !?Я еще не совсем уверен, когда помещать код в метод контроллера или в службу.(За исключением случаев, когда мне нужны функциональные возможности службы в более чем одном контроллере, очевидно. Любые советы / статьи, касающиеся этой темы, приветствуются.)Я не обязательно хочу использовать MediatR или функциональный подход (см. Здесь: https://www.youtube.com/watch?v=IROSd7uB-tg&t=35m11s), но это может быть то, что я ищу.
В лучшем случае я хочу сделать все / некоторые изфункциональность реакции асинхронно или даже параллельно.
Такое событие, как «эта ссылка была закрыта - кому-то интересно?», казалось жизнеспособной идеей.