Разница между AddTransient, AddScoped и AddSingleton в ASP.NET Core

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Рубрика: Логично, но не очевидно. Артефакты 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
        }
    }
}

Полезные ссылки: Время существования служб

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Использовал подобную фишку для проброса DbContext класса в hosted services. Решение рабочее, но имхо, нестабильное (ибо ты всё равно лочишь контекст вручную и могут быть проблемы с concurrency)
Для подобной задачи в моём случае также подошли recurring tasks с использованием Hangfire (также можно использовать Quarts библиотеку)
Я бы сказал что решение из статьи стоит использовать только если альтернатив нет совсем.

Ну бывает синглетоны, которые слушают шину сообщений и подобные.

Допустим сервис подключенный к тому же RabbitMQ. Это должен быть один сервис на все приложение.

Підписатись на коментарі