Middle
Какво е внедряване на зависимости (DI) в ASP.NET Core?
sobes.tech AI
Отговор от 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;
}
// ... действия на контролера
}