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;
    }

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