Post #190
234
🍓Очень странные зависимости.
Сегодня будет странная задачка без правильного ответа. Есть вот такая регистрация сервисов:
⬇️ TelegramDialogProcessor(GetUserFeatureHandler handler)
⬇️ GetUserFeatureHandler(ITraleDbContext context)
⬇️ ITraleDbContext - ни от кого не зависит
Методы IDialogProcessor вызываются из кода контроллера. Вопрос. Сможет ли разрезолвиться scoped сервис ITraleDbContext при таком вызове?
Короче ответ: "квантовое да".
По идее, контроллер создаст скоуп и далее все вызовы будут идти с этим скоупом. И все должно заработать и это работатет. Но… Не в тестах с использованием TestServer!
😵 Причем не будет работать, если запускать эти тесты из консоли при помощи dotnet test. В этом случае ITraleDbContext не резолвится с жалобами на потерянный скоуп: "Cannot resolve scoped service 'Application.Common.ITraleDbContext' from root provider."
А сейчас вообще странное — при запуске тестов из Test Explorer райдера всё работает! Как и почему? Я вот сейчас пытаюсь понять.
❓ Кто-то знает, как посмотреть, какую консольную команду вызывает райдер при запуске тестов? А может у кого есть предположение, почему так может быть? Почему блин скоуп может теряться в зависимости от того, как запускать тесты блин?
Наткнулся вот недавно в своем тралеботе, интересно было бы докопаться до сути.
Сегодня будет странная задачка без правильного ответа. Есть вот такая регистрация сервисов:
services.AddSingleton<IDialogProcessor, TelegramDialogProcessor>();Порядок регистрации совпадает с порядком зависимости, то есть:
services.AddTransient<GetUserFeatureHandler>();
services.AddScoped<ITraleDbContext>(provider=>provider.GetService<TraleDbContext>() ?? throw new InvalidOperationException());
⬇️ TelegramDialogProcessor(GetUserFeatureHandler handler)
⬇️ GetUserFeatureHandler(ITraleDbContext context)
⬇️ ITraleDbContext - ни от кого не зависит
Методы IDialogProcessor вызываются из кода контроллера. Вопрос. Сможет ли разрезолвиться scoped сервис ITraleDbContext при таком вызове?
Короче ответ: "квантовое да".
По идее, контроллер создаст скоуп и далее все вызовы будут идти с этим скоупом. И все должно заработать и это работатет. Но… Не в тестах с использованием TestServer!
😵 Причем не будет работать, если запускать эти тесты из консоли при помощи dotnet test. В этом случае ITraleDbContext не резолвится с жалобами на потерянный скоуп: "Cannot resolve scoped service 'Application.Common.ITraleDbContext' from root provider."
А сейчас вообще странное — при запуске тестов из Test Explorer райдера всё работает! Как и почему? Я вот сейчас пытаюсь понять.
❓ Кто-то знает, как посмотреть, какую консольную команду вызывает райдер при запуске тестов? А может у кого есть предположение, почему так может быть? Почему блин скоуп может теряться в зависимости от того, как запускать тесты блин?
Наткнулся вот недавно в своем тралеботе, интересно было бы докопаться до сути.
- 🤔 4
- 👀 2


