Мой делегат никогда не запускается в ядре .net

Я создал API в ядре .net с C#, который имеет набор элементов. В этой коллекции есть делегат, который срабатывает при добавлении (работе) нового элемента. Проблема в том, что я не могу заставить его работать, если не подпишусь на делегата от контроллера.

Текущий сценарий:

    [HttpPost("welcome")]
    public IActionResult Welcome([FromBody] MyClient newClient)
    {
        ClientsDataStore.Current.clients.Push(newClient);
        return Ok(newClient);
    }

Я создал класс MyClass:

public class MyClass
{
    ILogger<MyClass> logger;

    public MyClass(ILogger<MyClass> logger)
    {
        this.logger = logger;
        ClientsDataStore.Current.clients.ElementAdded += ListenClients;
    }

    public async void ListenClients(object sender, MyClient e)
    {
        logger.LogDebug($"New client added");

        if (e.VirtualMachine)
        {
            await ProcessVMAsync(e);
        }
        else
        {
            await ProcessDesktopAsync(e);
        }
    }
 }

Я попытался зарегистрировать класс в public void ConfigureServices (службы IServiceCollection) следующим образом:

services.AddTransient<MyClass>();

В этом сценарии делегат никогда не запускается, но если я использую:

    [HttpPost("welcome")]
    public IActionResult Welcome([FromBody] MyClient newClient)
    {
        ClientsDataStore.Current.clients.ElementAdded += ListenClients;

        ClientsDataStore.Current.clients.Push(newClient);
        return Ok(newClient);
    }

Затем запускается событие.

Я хотел бы знать, чего мне здесь не хватает, и как я мог это сделать.

ОБНОВИТЬ:

Я изменил подход к решению. У меня будет фоновая служба, проверяющая каждые 10 секунд, есть ли в коллекции новый элемент.

Вы должны посмотреть время жизни объектов AddTransient и забыть об использовании событий в asp.net.

Henk Holterman 05.03.2019 12:44

Вы знаете, что ваш класс выше никогда не будет освобожден, и у вас будет утечка памяти? События содержат ссылку на подписанный объект, и если вы не отмените подписку, для него всегда будет ссылка и, следовательно, он никогда не будет собираться сборщиком мусора. Также async avoid следует использовать НИКОГДА, за исключением обработчиков событий пользовательского интерфейса. И последнее, но не менее важное: MyClass никогда не разрешается и не создается экземпляр. Простая регистрация его в IoC не означает, что он будет создан. Он будет создан только тогда, когда это действительно необходимо в первый раз, а не раньше.

Tseng 05.03.2019 13:04

@HenkHolterman, что вы подразумеваете под «забудьте об использовании событий в asp.net»? Не рекомендуется?

charlie.mtp 05.03.2019 13:07

Нет, asp.net не имеет состояния, а для событий требуется среда с отслеживанием состояния. Все, что вы используете, реконструируется при каждом новом запросе.

Henk Holterman 05.03.2019 13:09

В любом случае, вы можете Разогрев использовать метод MyClass в методе Configure, но этот шаблон все равно грязный, и вы получите много проблем (MyClient является временным и будет удален в конце запроса, но вы используете async void, поэтому действие вашего контроллера не будет ждать конкуренции. Это приводит к завершению запроса, и все (одноразовые) переходные и ограниченные объекты будут удалены, что может произойти задолго до завершения вашего обратного вызова (или даже до его начала). Лучше используйте a слабосвязанный pub/sub или библиотека планирования (например, quart или hangfire)

Tseng 05.03.2019 13:10

@HenkHolterman: Что заставляет тебя так думать? ClientsDataStore кажется одноэлементным по шаблону, к которому он обращается (и не внедряется в MyClass). Шаблон singleton обычно включает вызов MyClass.Instance или MyClass.Current

Tseng 05.03.2019 13:18

Спасибо @Tseng. Не могли бы вы объяснить мне лучше об утечке памяти? Как решить проблему с асинхронная пустота? Пока я знаю, что все делегаты должны быть недействительными, не так ли? Насчет твоего Последний, но тем не менее важный (самое важное для меня ;) ) Заменил: services.AddTransient<Listeners>(); на: Listeners test1 = new Listeners(LoggerFactory); И вроде работает. Это лучший подход?

charlie.mtp 05.03.2019 13:18

@Tseng - да, ClientsDataStore может быть синглтоном (статическим). Не должно быть, конечно.

Henk Holterman 05.03.2019 13:54

@Tseng Вы правы, ClientsDataStore - это синглтон. Но у меня в памяти есть список клиентов, которые мне нужны, чтобы он был доступен с каждой конечной точки. Есть ли другой способ добиться этого?

charlie.mtp 05.03.2019 13:57

Ответом будет внедрение ClientDataStore в контроллер с уже подключенным обработчиком событий.

Jesse de Wit 05.03.2019 14:52

Это звучит как хороший случай для шины событий. Вот пример, хотя он, возможно, немного устарел: scotthannen.org/blog/2016/04/01/event-bus-implementation.htm‌​l. Или вы можете вводить функции/делегаты для выполнения непосредственно в свой класс. Эти функции могут быть статическими классами или методами классов, разрешенных контейнером.

Scott Hannen 05.03.2019 15:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
107
0

Другие вопросы по теме