.NET Core внедрение зависимостей — это ключевой механизм, который помогает создавать гибкие, поддерживаемые и масштабируемые приложения. В этом материале вы узнаете, как правильно использовать внедрение зависимостей (DI), избегать тесной связности компонентов и применять лучшие практики при работе с DI-контейнером в .NET Core.
Что такое внедрение зависимостей в .NET Core
Внедрение зависимостей — это паттерн проектирования, позволяющий отделить создание объектов от их использования. В .NET Core DI встроен в платформу, что делает его мощным инструментом для всех типов проектов: от консольных приложений до веб‑API и сервисов.
Основные преимущества DI
- Уменьшение связности компонентов.
- Упрощение тестирования благодаря легкой подмене зависимостей.
- Централизованная настройка сервисов.
- Гибкость при расширении приложения.
Настройка DI в различных типах проектов
Настройка системы внедрения зависимостей зависит от типа проекта. Независимо от окружения, базовый процесс включает регистрацию сервисов, их конфигурацию и последующее использование.
Веб‑приложения ASP.NET Core
В проектах ASP.NET Core большинство регистраций выполняется в методе Program.cs или Startup.cs (в старых шаблонах).
Пример регистрации сервиса
builder.Services.AddTransient<IMyService, MyService>();
Консольные приложения
Консольные приложения также поддерживают DI через Generic Host.
Пример создания хоста
using IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddSingleton<IMyService, MyService>();
})
.Build();
Способы добавления зависимостей
.NET Core предоставляет несколько вариантов регистрации сервисов, что позволяет точно контролировать время жизни и логику их создания.
Основные типы времени жизни
- Transient — создается новый экземпляр при каждом запросе.
- Scoped — один экземпляр на запрос (веб‑контекст).
- Singleton — один экземпляр на время работы приложения.
Расширенные сценарии регистрации
- Регистрация нескольких реализаций одного интерфейса.
- Использование фабрик для создания зависимостей.
- Внедрение параметров и конфигураций.
- Получение зависимостей из других библиотек.
Получение зависимостей
После регистрации сервисов их можно получить через конструктор (рекомендуемый способ), через внедрение в методы или через сервис‑локатор (в редких случаях).
Внедрение через конструктор
public class MyController
{
private readonly IMyService _service;
public MyController(IMyService service)
{
_service = service;
}
}
Пограничные и продвинутые случаи
Система DI в .NET Core поддерживает сложные и нетривиальные сценарии, полезные при проектировании крупных приложений.
Поддерживаемые возможности
- Внедрение коллекций зависимостей.
- Использование IOptions для конфигурации.
- Вложенные зависимости и цепочки сервисов.
- Работа с динамическими параметрами конструктора.
Заключение
Понимание принципов внедрения зависимостей в .NET Core позволяет создавать чистую архитектуру, уменьшать технический долг и повышать качество кода. Освоив DI, вы сможете уверенно проектировать проекты любой сложности и эффективно управлять их зависимостями.