Разница между AddTransient, AddScoped и AddSingleton в ASP.NET Core
Рубрика: Логично, но не очевидно. Артефакты Cod Review;
Нельзя через конструктор с помощью DI внедрять службу, время жизни которой объявлено меньше, чем та, которая эту службу использует.
Т.е. нельзя в службе объявленной как AddSingleton , внедрять через конструктор службу объявленную как AddTransient или AddScoped. А в службу AddScoped, внедрять AddTransient.
В таких случаях следует использовать сервис через внедрение в конструктор IServiceScopeFactory, и использовать конструкцию:
public class MyScopedClass
{
private readonly IServiceScopeFactory _scopeFactory;
public MyScopedClass(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
public void UseTransiendService()
{
using (var scope = _scopeFactory.CreateScope())
{
var myTransientService = scope.ServiceProvider.GetRequiredService<IMyTransientService>();
//use myTransientService
}
}
}
Полезные ссылки: Время существования служб
5 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівИспользовал подобную фишку для проброса DbContext класса в hosted services. Решение рабочее, но имхо, нестабильное (ибо ты всё равно лочишь контекст вручную и могут быть проблемы с concurrency)
Для подобной задачи в моём случае также подошли recurring tasks с использованием Hangfire (также можно использовать Quarts библиотеку)
Я бы сказал что решение из статьи стоит использовать только если альтернатив нет совсем.
Ну бывает синглетоны, которые слушают шину сообщений и подобные.
Допустим сервис подключенный к тому же RabbitMQ. Это должен быть один сервис на все приложение.