Этот краткий блог про 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();
Hosted Service
Hosted Service - Используется для запуска и завершения фоновых задач которые нужны для обработки запросов при запуске приложения а также для периодических проверок программы по типу health check, отправка телемитрии сервиса, инвалидация кэша. Hosted Service запускается при помощи вызова метода который наследует IHostedService и содержит два метода
StartAsync()
иStopAsync()
Пример кода
Вызов класса
builder.Services.AddHostedService<RunWhenStart>();
Имплементация класса
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;
}
}
Top comments (0)