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;
}
// ... действия на контролера
}