Middle
Šta je ubrizgavanje zavisnosti (DI) u ASP.NET Core?
sobes.tech АИ
Одговор од АИ
Уграђивање зависности (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;
}
// ... акције контролера
}