Sobes.tech
Middle

Какво е внедряване на зависимости (DI) в ASP.NET Core?

sobes.tech AI

Отговор от AI

Внедряването на зависимости (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;
    }

    // ... действия на контролера
}