Sobes.tech
Middle

Šta je ubrizgavanje zavisnosti (DI) u ASP.NET Core?

sobes.tech АИ

Одговор од АИ

Уграђивање зависности (DI) је образац дизајна за инверзију контроле (IoC), који омогућава стварање слабо повезаног кода. У ASP.NET Core, DI је уграђена функција која олакшава управљање зависностима између класа.

Основне компоненте DI у ASP.NET Core:

  1. Сервиси: Објекти који пружају функционалност (нпр. класе репозиторија, сервиси за логовање).
  2. Контейнер DI: Објекат задужен за решавање зависности и креирање примерака сервиса.
  3. Време живота сервиса: Одређује када и како се креирају примерци сервиса:
    • 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;
    }

    // ... акције контролера
}