DEV Community

Nomon
Nomon

Posted on

Dependency Container and Services Lifetimes (На русском)

Этот краткий блог про Dependency Container и Services Lifetimes в котором я объясню:

  • Что такое Dependency Container.
  • Что такое Services Lifetimes.
  • Что такое Hosted Service.

Приятного чтения

Dependency Container

Dependency Container - это инструмент который управляет жизненным компонента. DI Контейнер отвечает за создание и удаление экземпляров необходимых служб, отслеживая их и поддерживая в течение всего срока службы. Если в вашей системе есть компоненты которые имеют свои зависимости, то класс знает что внедрять во все эти компоненты.

Service Lifetimes

Service Lifetimes - DIC (Dependency Injection Container) имеет три типа жизненных циклов. Для создания каждого типа сервиса предназначен соответствующий метод AddTransient(), AddScoped() и AddSingleton().

  • AddTransient при каждом обращении к сервису создается новый объект сервиса. В течение одного запроса может быть несколько обращений к сервису, соответственно при каждом обращении будет создаваться новый объект. Подобная модель жизненного цикла наиболее подходит для легковесных сервисов, которые не хранят данных о состоянии.

builder.Services.AddTransient<IDependent, Dependent>();

  • AddSingleton объект сервиса создается при первом обращении к нему, все последующие запросы используют один и тот же ранее созданный объект сервиса

builder.Services.AddSingleton<IDependent, Dependent>();

  • AddScoped для каждого запроса создается свой объект сервиса. То есть если в течение одного запроса есть несколько обращений к одному сервису, то при всех этих обращениях будет использоваться один и тот же объект сервиса.

builder.Services.AddScoped<IDependent, Dependent>();

Тип службы указывается при регистрации службы в контейнере, поскольку служба может использоваться в разных местах приложения, срок службы службы будет влиять на то, будет ли один и тот же экземпляр службы использоваться во всем приложении, что повлияет на выходные данные.

Пример кода

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var builder = new HostApplicationBuilder();

builder.Services.AddTransient<IDependent, Dependent>();
builder.Services.AddSingleton<ITimeProvider, TransientTimeProvider>();
builder.Services.AddScoped<IDependent, Dependent>();
builder.Services.AddHostedService<RunWhenStart>();

var application = builder.Build();

var scopeProvider = application.Services.GetRequiredService<IServiceScopeFactory>();

var service1 = application.Services.GetRequiredService<IDependent>();
service1.Run();

using (var scope = scopeProvider.CreateScope())
{
    var innerservice1 = scope.ServiceProvider.GetRequiredService<IDependent>();
    var innerservice2 = scope.ServiceProvider.GetRequiredService<IDependent>();

    innerservice1.Run();
    innerservice2.Run();
}

application.Run(); 
Enter fullscreen mode Exit fullscreen mode

Hosted Service

Hosted Service - Используется для запуска и завершения фоновых задач которые нужны для обработки запросов при запуске приложения а также для периодических проверок программы по типу health check, отправка телемитрии сервиса, инвалидация кэша. Hosted Service запускается при помощи вызова метода который наследует IHostedService и содержит два метода StartAsync() и StopAsync()

Пример кода

Вызов класса

builder.Services.AddHostedService<RunWhenStart>();
Enter fullscreen mode Exit fullscreen mode

Имплементация класса

public class RunWhenStart : IHostedService
{
    public async Task StartAsync(CancellationToken cancellationToken = default)
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("WEB APP STARTED " + i);
            await Task.Delay(1000, cancellationToken);
        }
    }

    public Task StopAsync(CancellationToken cancellationToken = default)
    {
        Console.WriteLine("WEB APP STOPPED");
        return Task.CompletedTask;
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)