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