Где можно зарегистрировать сервис в ASP.NET Core?

«Где можно зарегистрировать сервис в ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Регистрация сервисов происходит в контейнере внедрения зависимостей (DI) на этапе конфигурации приложения. Место зависит от шаблона проекта:

  1. В Program.cs (шаблон .NET 6 и новее): Основное и единственное место в минимальном API.

    var builder = WebApplication.CreateBuilder(args);
    // Конфигурация сервисов (DI)
    builder.Services.AddScoped<IMyService, MyService>();
    builder.Services.AddControllers();
    var app = builder.Build();
  2. В 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"));