web-api net core. В DI контейнере настраивается жизненных цикл объектов в том числе и объекта UoW который в себе хранит EF контекст. этот UoW реализует dispose метод ,который выставляет null внутреннему полю тип, которого EF контекст, и так же диспойзит его. То есть есть UoW объект, который реализует IDisposable. этот UoW объект передается в конструктор контроллера. в DI контейнере этот UoW объект зареган в Scoped жизнненом цикле. НООО в методе контролера два действия! 1) выполнить какие-то преобразования и сохранить это в БД через объект UoW и его Method1() , а перед этим создается ОТДЕЛЬНЫЙ ПОТОК в который передается тот же самый UoW объект, который выполняет длительную операцию (около нескольких минут) по принципу запустил и забыл в Method2() и в самом конце этого метода дергается контекст EF и пытается сохранить что-то в бд. Как ни трудно догадаться в итоге в Method2() возникает Null ref exception тк контейнер DI вызвал Dispose у объекта UoW. Я почти уверен, что в такой ситуации нельзя дергать в другом потоке объекты жизненных цикл которых настраивается для другой цели и задачи. Но тогда как лучше поступить? Но я могу ошибаться, для того и пишу вопрос. Из решений на ум приходит только создание отдельного сервиса, который будет слушать поступление новых команд на выполнение какого либо запроса (quartz, hangfire) и выполнять ту самую операцию которая лежит в Method2(), а в методе контроллера где дергался Method1() написать что-то вроде отправки команды на выполнение работы в Method2()
на ум пришло верное решение, так и делайте. наследуете IHostedService, запускаете таску со стартом приложения и пуляете в нее Items для обработки.
То есть в асп нет коре есть фоновые сервисы которые слушают входящую очередь сообщений? прикольно! звучит как то что нужно! спасибо
Оно не слушает входящую очередь по дефолту — это надо ручками написать. Но фоновые задачи есть, да.
но сам факт, что можно дернуть из моего родительского метод апи этого фонового сервиса положив туда сериализованный объект над которым надо попотеть ему?
ога, так можно. но тут еще другой вопрос сразу учтите: 1. метод контроллера отработал и положил в очередь Item 2. в очереди уже N item-ов 3. приложение выключили (свет потух, сервак в ребут, и т.д.) что делать с объектами, которые были в очереди, но не успели обработаться?
ну лично я бы записывал в персистентное хранилище команду на обработку вторым фоновым процессом. но это уже детали.
ну просто продумайте этот момент, а так все правильно думаете — фоновый сервис и обработка отдельно от метода контроллера.
Обсуждают сегодня