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

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay