ASPNET Dependency Injection - gro1vy/DeliverServiceAPI GitHub Wiki

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

Что такое Dependency Injection?

Dependency Injection (DI) представляет собой методологию и паттерн проектирования, используемые для управления зависимостями и инъекции зависимостей в ASP.NET приложения. Он позволяет разработчикам разделить компоненты приложения и внедрить зависимости (например, сервисы, объекты доступа к данным и другие) в другие компоненты, не создавая их напрямую внутри кода, что делает приложение более модульным, тестируемым и легким для сопровождения.

Вот основные концепции и компоненты ASP.NET Dependency Injection:

  1. Сервис-контейнер (Service Container): Сервис-контейнер является центральной частью DI. Это механизм, который управляет регистрацией и разрешением зависимостей.
  2. Зависимости (Dependencies): Зависимости - это объекты, которые необходимы для правильной работы компонентов приложения. Это могут быть сервисы, хранилища данных, настройки и другие объекты. Вместо создания зависимостей напрямую внутри компонента, они запрашиваются из сервис-контейнера.
  3. Регистрация зависимостей (Dependency Registration): Зависимости должны быть зарегистрированы в сервис-контейнере. Это делается обычно в начале приложения, при настройке контейнера. Регистрация сообщает контейнеру, какой объект создавать, когда он запрашивается.
  4. Инъекция зависимостей (Dependency Injection): Инъекция зависимостей - это процесс предоставления зависимостей компонентам, когда они создаются или запрашиваются. Зависимости могут быть инъектированы через конструкторы, свойства или методы.
  5. Область видимости зависимостей (Dependency Scope): Контейнер может управлять временем жизни зависимостей. Например, зависимость может быть создана один раз и использоваться повторно во всем запросе, или она может быть создана для каждого запроса. Это позволяет управлять ресурсами и жизненным циклом зависимостей.

Как использовать Dependency Injection в проекте?

Допустим у нас есть следующий класс, добавим его в сервисы.

 public class WeatherForecastService 
 {
     private static readonly string[] Summaries = new[]
     {
         "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
     };

     public string GetWeather(int id)
     {
          return Summaries[id];
     }
 }

Для этого в классе Program.cs пропишем следующую строку:

builder.Services.AddScoped<WeatherForecastService>();

Тут Services это контейнер, а AddScoped указывает, как будет определяться жизненный цикл сервисы, в данном случае это тип Scoped, а в общем случае будет AddType, и Type может соответствовать одному из следующих типов:

  1. Transient: При каждом запросе зависимости будет создаваться новый экземпляр. Этот тип подходит для легковесных, неизменяемых служб, которые не хранят состояние.
  2. Scoped: В рамках одного HTTP-запроса будет создан и использован один экземпляр зависимости. Это полезно для компонентов, связанных с обработкой одного запроса.
  3. Singleton: Всегда будет использоваться один и тот же экземпляр зависимости на протяжении всего жизненного цикла приложения. Это подходит для служб, которые должны существовать в единственном экземпляре.

И там, где нам понадобится этот класс в конструкторе нужно указать его.

public class Test
{
    private readonly WeatherForecastService _weatherForecastService ;

    public UserRepository(WeatherForecastService weatherForecastService )
    {
        _weatherForecastService = weatherForecastService;
    }

    // Использование _weatherForecastService 
}