Middle
ASP.NET Core'da bog'lanishni injektsiya qilish (DI) nima?
sobes.tech AI
AIdan javob
Bağımlılıqlarni injektsiya qilish (DI) - bu nazoratni teskari qilish (IoC) uchun dizayn shabloni bo'lib, u zaif bog'langan kod yaratishga imkon beradi. ASP.NET Core'da DI o'z ichiga olgan funksiyadir, u sinflar o'rtasidagi bog'liqliklarni boshqarishni osonlashtiradi.
ASP.NET Core'da DI ning asosiy komponentlari:
- Xizmatlar: Funktsiyalarni ta'minlaydigan obyektlar (masalan, depo sinflari, loglash xizmatlari).
- DI konteyneri: Bog'liqliklarni hal qilish va xizmat nusxalarini yaratish uchun javobgar obyekt.
- Xizmatlarning hayot aylanishi: Qachon va qanday qilib xizmat nusxalari yaratilishini belgilaydi:
- Transient: Har bir xizmat so'rovi uchun yangi nusxa yaratiladi.
- Scoped: Har bir so'rov uchun (veb ilovalar uchun - har bir HTTP so'rovi uchun) bir nusxa.
- Singleton: Birinchi so'rovda yaratiladi va ilova davomida ishlatiladi.
DI dan foydalanishning afzalliklari:
- Zaif bog'lanish: Sinflar aniq (interfeyslar) ga bog'liq bo'lib, aniq amalga oshirishlarga emas.
- Test qilish imkoniyati: Haqiqiy bog'liqliklarni "mocks" yoki "stubs" bilan oson almashtirish mumkin.
- Kengaytirilishi: Xizmatlarning amalga oshirishlarini ularni o'zgartirmasdan o'zgartirish oson.
- Bog'liqliklarni boshqarish: DI konteyneri hayot aylanishini va nusxalarni yaratishni boshqaradi.
Startup.cs (yoki .NET 6+ uchun Program.cs) da xizmatlarni ro'yxatdan o'tkazish misoli:
// ConfigureServices metodida
public void ConfigureServices(IServiceCollection services)
{
// Singleton hayot aylanishi bilan xizmatni ro'yxatdan o'tkazish
services.AddSingleton<ILogger, EmailLogger>();
// Scoped hayot aylanishi bilan xizmatni ro'yxatdan o'tkazish
services.AddScoped<IDataRepository, SqlDataRepository>();
// Transient hayot aylanishi bilan xizmatni ro'yxatdan o'tkazish
services.AddTransient<ITransientService, TransientService>();
// Kontrollerlarni bog'liqliklarni in'ektsiya qilish uchun ro'yxatdan o'tkazish
services.AddControllersWithViews();
}
Kontroller konstruktorida bog'liqliklarni in'ektsiya qilish:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI bu bog'liqliklarni avtomatik hal qiladi va in'ektsiya qiladi
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... kontroller harakatlari
}