понять, имеется ли нормальное архитектурное решение, или всё-таки придется делать не по best practices.
                  
                  
                  Суть такова: есть 4 сервиса:
                  
                  
                  1. Менеджер (transient). Пихает в синглтон очередь айтемы, пишет об этом в таблицу в БД (через EF).
                  
                  
                  2. Очередь (singleton). Обертка над ConcurrentQueue, соответственно имеет только два метода: enqueue и dequeue
                  
                  
                  3. Воркер (HostedService). Постоянно дергает очередь, получает из неё айтем, передает в соответствующий сервис обработки.
                  
                  
                  4. Сервис обработки (transient). Делает что-то с айтемом и отмечает в БД этот айтем обработанным.
                  
                  
                  
                  
                  
                  Собственно, проблема в том, что контекст бд у нас scoped, и попытка инжекта в сигнлтон приводит к понятной ошибке.
                  
                  
                  
                  
                  
                  Собственно, вопрос 1: что с этим можно сделать? Инжектить сервис провайдер и при каждом запросе из него получать контекст много где в интернетах не рекомендуют.
                  
                  
                  
                  
                  
                  Вопрос 2: увеличивать время жизни у контекста бд тоже не рекомендуют. К чему вообще это может привести?
                  
                  
                  
                  
                  
                  UPD: пока писал, подумал, что можно будет перетащить любое обращение бд в этом контексте в объект очереди, но тут та же самая проблема, что инжектим в синглтон.
                  
                  
                
IDatabase — поистине целительный паттерн, и решает и эту проблему тоже.
Обсуждают сегодня