Ответ
Регистрация сервисов происходит в контейнере внедрения зависимостей (DI) на этапе конфигурации приложения. Место зависит от шаблона проекта:
-
В
Program.cs(шаблон .NET 6 и новее): Основное и единственное место в минимальном API.var builder = WebApplication.CreateBuilder(args); // Конфигурация сервисов (DI) builder.Services.AddScoped<IMyService, MyService>(); builder.Services.AddControllers(); var app = builder.Build(); -
В
Startup.ConfigureServices(шаблон .NET Core 3.1, 5): Классический подход.public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddTransient<IEmailSender, EmailSender>(); services.AddRazorPages(); } }
Основные методы регистрации:
| Метод | Время жизни экземпляра | Типичный use-case |
|---|---|---|
AddTransient<TService, TImplementation>() |
Создаётся новый для каждого запроса к контейнеру. | Легковесные, stateless сервисы (например, валидаторы). |
AddScoped<TService, TImplementation>() |
Один экземпляр на протяжении одного HTTP-запроса (scope). | Сервисы, работающие в контексте запроса (например, DbContext в EF Core). |
AddSingleton<TService, TImplementation>() |
Единственный экземпляр на всё время работы приложения. | Сервисы-кэши, конфигурации, логгеры. |
Дополнительные способы:
- Регистрация существующего экземпляра:
services.AddSingleton<IMyService>(existingInstance); - Регистрация через фабричный метод:
services.AddScoped<IMyService>(sp => new MyService("config"));