Назад к вопросам
Middle
277
questionbank
Что такое внедрение зависимостей (DI) в ASP.NET Core?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Внедрение зависимостей (DI) — это шаблон проектирования для инверсии управления (IoC), который позволяет создавать слабосвязанный код. В ASP.NET Core DI является встроенной функцией, позволяющей легко управлять зависимостями между классами.
Основные компоненты DI в ASP.NET Core:
- Сервисы: Объекты, предоставляющие функциональность (например, классы репозиториев, сервисы логирования).
- Контейнер DI: Объект, отвечающий за разрешение зависимостей и создание экземпляров сервисов.
- Время жизни сервисов: Определяет, когда и как создаются экземпляры сервисов:
- Transient: Новый экземпляр создается при каждом запросе сервиса.
- Scoped: Один экземпляр создается на каждый запрос (для веб-приложений — на каждый HTTP-запрос).
- Singleton: Один экземпляр создается при первом запросе и используется на протяжении всего времени работы приложения.
Преимущества использования DI:
- Слабая связанность: Классы зависят от абстракций (интерфейсов), а не от конкретных реализаций.
- Тестируемость: Легко заменять реальные зависимости на "заглушки" (mocks) или "муляжи" (stubs) при юнит-тестировании.
- Расширяемость: Легко заменять реализации сервисов без изменения кода, зависящего от них.
- Управляемость зависимостями: Контейнер DI управляет жизненным циклом и созданием экземпляров.
Пример регистрации сервисов в Startup.cs (или Program.cs в .NET 6+):
// В методе ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
// Регистрация сервиса с singleton временем жизни
services.AddSingleton<ILogger, EmailLogger>();
// Регистрация сервиса с scoped временем жизни
services.AddScoped<IDataRepository, SqlDataRepository>();
// Регистрация сервиса с transient временем жизни
services.AddTransient<ITransientService, TransientService>();
// Регистрация контроллеров для внедрения зависимостей в них
services.AddControllersWithViews();
}
Внедрение зависимостей в конструктор контроллера:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI автоматически разрешает и внедряет эти зависимости
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... действия контроллера
}