ASPNET Dependency Injection - gro1vy/DeliverServiceAPI GitHub Wiki
Для облегчения получения сервисов в классах других сервисов или контроллерах, в проекте используются DI контейнеры, к тому же их использование рекомендует Microsoft в своей документации, которую можно посмотреть по этой ссылке. Здесь же будет более кратко рассмотрены DI контейнеры.
Что такое Dependency Injection?
Dependency Injection (DI) представляет собой методологию и паттерн проектирования, используемые для управления зависимостями и инъекции зависимостей в ASP.NET приложения. Он позволяет разработчикам разделить компоненты приложения и внедрить зависимости (например, сервисы, объекты доступа к данным и другие) в другие компоненты, не создавая их напрямую внутри кода, что делает приложение более модульным, тестируемым и легким для сопровождения.
Вот основные концепции и компоненты ASP.NET Dependency Injection:
- Сервис-контейнер (Service Container): Сервис-контейнер является центральной частью DI. Это механизм, который управляет регистрацией и разрешением зависимостей.
- Зависимости (Dependencies): Зависимости - это объекты, которые необходимы для правильной работы компонентов приложения. Это могут быть сервисы, хранилища данных, настройки и другие объекты. Вместо создания зависимостей напрямую внутри компонента, они запрашиваются из сервис-контейнера.
- Регистрация зависимостей (Dependency Registration): Зависимости должны быть зарегистрированы в сервис-контейнере. Это делается обычно в начале приложения, при настройке контейнера. Регистрация сообщает контейнеру, какой объект создавать, когда он запрашивается.
- Инъекция зависимостей (Dependency Injection): Инъекция зависимостей - это процесс предоставления зависимостей компонентам, когда они создаются или запрашиваются. Зависимости могут быть инъектированы через конструкторы, свойства или методы.
- Область видимости зависимостей (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 может соответствовать одному из следующих типов:
- Transient: При каждом запросе зависимости будет создаваться новый экземпляр. Этот тип подходит для легковесных, неизменяемых служб, которые не хранят состояние.
- Scoped: В рамках одного HTTP-запроса будет создан и использован один экземпляр зависимости. Это полезно для компонентов, связанных с обработкой одного запроса.
- Singleton: Всегда будет использоваться один и тот же экземпляр зависимости на протяжении всего жизненного цикла приложения. Это подходит для служб, которые должны существовать в единственном экземпляре.
И там, где нам понадобится этот класс в конструкторе нужно указать его.
public class Test
{
private readonly WeatherForecastService _weatherForecastService ;
public UserRepository(WeatherForecastService weatherForecastService )
{
_weatherForecastService = weatherForecastService;
}
// Использование _weatherForecastService
}